Well for your example of error trapping, as I said with Sabby's example, switch() would be better, in your example error handling (try, except, finally, throw) would be a much better way to do error handling than a goto trap.
...none of which are currently in mIRC scripting. Furthermore, the error condition is what you need the goto for, not how it's handled. If-elseif-elseif-else (aka switch (basically)) is how you'd decide just what to do about the error, if anything. You can bet that try/catch won't be in mIRC anytime soon; mIRC is not reentrant in any meaningful way, though you can fake it a bit. Seems to me I remember seeing on ERROR goto whatever .. in many high level languages.
I cannot honestly remember a time when I have written (not modified older code) a goto into a script. The ONLY place I can remember using it in the 3 years since while () was added is in on SOCKREAD, and that was probably more out of habit and follow the old example in the help file to get everything started. It's simple enough to put the code you want to jump to into an alias and simply call that alias (which will return or not).
All that being said, I STILL disagree that ANY language element is "bad." There are perhaps "better" ways of doing things, but GOTO is not inherently bad. What you are objecting to is the bad coding practices that its overuse or misuse lead to; THAT I quite agree with. That's like saying SET is bad because we have /writeini, /var, /hadd, etc. or it's bad because you can easily get your variables written over by another scripter's script that uses the same variable names as yours does (how rude!).
If you truly believe GOTO is bad, I strongly suggest that you stay the hell away from assembly language.