The main reason your second script doesn't work, assuming you copied it exactly as is, is because the "on" is not on the same line as the rest of the event definition. Additionally, the following condition:
Code:
if ($2- && $nick == %ADMIN. [ $+ [ $chan ] ] || $nick == %SUPERADMIN)
is probably not what you want. Rather then checking "if $2- is not $null/$false/0, and $nick either equals %ADMIN. [ $+ [ $chan ] ] or %SUPERADMIN", it's really checking "if both $2- is not $null/$false/0 and $nick equals %ADMIN. [ $+ [ $chan ] ], OR if $nick equals %SUPERADMIN". To ensure your conditions are interpreted correctly, you should use parentheses around conditional groups...

Code:
if ($2-) && ($nick == %ADMIN. [ $+ [ $chan ] ] || $nick == %SUPERADMIN) { }


To witness the difference easily, try entering the following commands in mIRC:

Code:
//if 0 && 1 || 2 { echo -ga $v1 : $v2 }
//if (0) && (1 || 2) { echo -ga $v1 : $v2 }


It's a good idea to mention, however, that when you're checking if something can be any of a list of things (such as how $nick can either be %ADMIN. [ $+ [ $chan ] ] or %SUPERADMIN), there are easier ways to do so -- in this case, $istok() is a good choice:

Code:
if $2- && $istok(%ADMIN. [ $+ [ $chan ] ] %SUPERADMIN,$nick,32) { }


(Type /help $istok if you aren't sure how it or the other $*tok identifiers work.)

Note here that because the above statement only contains two conditions (The $istok() is considered one that returns $true if $nick is either of the "tokens" listed), there is only one way to interpret the statement and thus parentheses aren't needed.

Anyway, back on the subject of goto... In my opinion, there are certain cases where using goto may be desirable, but this is not one of those cases... As was mentioned before, you should really just associate the commands with the conditions... In other words, why
Code:
if %x == 1 { goto a }
:a
echo -ga Ok, $(%x,0) == 1
return
when you could just as easily:
Code:
if %x == 1 { echo -ga Ok, $(%x,0) == 1 }