Why? - Because you are on the wrong side thinking on the error handler as a GOSUB like subroutine, it simply isn't.
Do you GOSUB to it? - No, its ON ERROR GOTO, not GOSUB.
It's nothing more than a simple jump to another place in your main program, and you either jump back to the same faulty line with RESUME (so to say a retry loop), to the line following the faulty line with RESUME NEXT or to a complete different place in your main program with RESUME Label.
However, in all cases the error handling is done with the RESUME statement, no need for a RETURN at all, cause its not a GOSUB called routine.
If you place a RETURN nevertheless, and the program runs over the error handler by accident, then the RESUME will do nothing, as it internally know there was no error, so I don't need to RESUME somewere. Then the next line reached in the program flow is RETURN, which of course does panic, as there was no GOSUB call in the first place.
Hence as Fellippe already stated, it's just bad code....