Yes, you can use
mutate { remove_tag => "_grokparsefailure" }
If that is the only tag on the event that leaves tags as an empty array. You can remove that using this.
I notice that in your original grok filter you tried to do remove_tag => "_grokparsefailure". That does not work the way you want. "Decoration" of events, which implements the common options like remove_tag, only occurs if the filter succeeds. So it would only remove the _grokparsefailure if it had not been added.