If in a section of code within nested loops or loops within loops (of "while", "do" or "for") one wanted to jump out of all the loops from some inner loop, then the "break" statement would not do the job. Similarly, if from within an inner loop one wanted to continue an outer loop, the "continue" statement would not do the job. These are some examples of where a "goto" statement is preferable. The alternatives to the "goto" would require altering the loop variables - and this would be more complicated, slower, larger, and more likely to be incorrect (before or after changes to the program). The other structures for which the "goto" must be used do not involve simple loops or even nested loops. They are topologically more complex. See the following irreducible flow charts, and try to write the code for them without a "goto" statement!
| v ^ / \ /---<--< e1>-->--\ | \ / | +---+ v | | s1| v +---+ ^ | / \ \------>-*-<---< e2> | \ / v v +---+ | | s2| +---+ +---+ | s3| | +---+ | | \->-*-<-/ | v
| v ^ / \ < e1>-->---*---<---\ \ / | | v v | | +---+ | v | s2| | +---+ +---+ | | s1| | | +---+ v | | | | \----->--* | | | v | / \ | /---<--< e2>-->--/ | \ / v v
| v *--<----\ | | v | / \ | /--<--< e1> | | \ / | v v | +---+ | | | s | | | +---+ v | | ^ | v / \ | *--<--< e2>-->--/ | \ / v v
| v /---->--* | | | v | +---+ | | s | | +---+ | | | v | *--<------\ | | | | | ^ | v | | ^ ^ | / \ / \ \--<--< e1>-->--< e2> \ / \ / v v | v
| v /------------>--*--<------------\ | | | | v | ^ ^ ^ | / \ | | /--<--< e1>-->--\ | | | \ / | | | v v v | | / \ / \ | \--<--< e2> < e3>-->--/ \ / \ / v v | | v v