The main arguments against gotos originated in the early days of "structured programming" -- when ALGOL, PL/I, etc, were introduced (and much later, Pascal, Modula, and C). Before that, there was FORTRAN, COBOL, assembler, etc. The 'goto' statement coupled with the 'if' statement was about the only flow control statements available.
With the introduction of nested functions (C doesn't support these), local-block scope, and more "structured" flow control statements (while, switch, do, etc.) and early-exit mechanisms (break, continue, return), the goto was much less necessary, and was frequently used by "bad programmers" (ones w/ FORTRAN backgrounds, for example) when a more appropriate construct could have been used, hence it's bad reputation.
Although the goto statement can almost always be avoided, it can be useful, and can in fact make code more readable and robust (as WMCoolmon pointed out) -- better than 20 nested
if (!error) { ... }.
There's a reason why it was left in the C language

*steps down from lectern*