Well it was, before the time of smarter optimizing compilers, and simpler CPU constructs. Back when compilers simply translated statements to a lower level language, goto worked as indicated.
But it works just fine in C/C++ and a dozen other languages that require forward variable declaration - like strict does.
Actually most of the arguements against it are the same as against self-modifying code.
A goto statement that jumps to the bottom of a set of nested loops is hardly unreadable - which is generally the argument against self modifying code, unless you have something else in mind.