Regarding the general subject of using GOTOs:
The first computer on which I did hands-on programming was an IBM
S/360 model 25. It had 32K of memory available for user
programs--that's both instructions and data. It executed code at
about a 30 KIPS (yes--KILO instructions/second) rate. When you're
programming on a machine that is that slow and with that limited an
address space, every instruction counts. You couldn't afford either
the space or the time to execute conditional tests just to avoid a
GOTO.
Programming using GOTOs doesn't necessarily mean you're writing rat's
nest or spaghetti code. Yes, you can make a mess using GOTOs, and
perhaps messy code is easier when GOTOs are allowed, but structured
programming just for its own sake can lead to convoluted and messy
program structure as well. What was rat's nest control flow with
GOTOs can turn into rat's nest data flow of state variables.
It's also worth noting that one of the main functions of a modern
optimizing compiler is to take your nice, structured program and put
all those rat's nest GOTOs (unconditional branch instructions) back so
the thing will execute more quickly.
-Paul W.