Criticism of goto usage:
The GOTO statement has been the target of much criticism, the claim being that use of GOTO produces unreadable and generally unmaintainable "spaghetti code" (whether the alternatives would be just as unreadable and generally unmaintainable is not usually discussed) . As structured programming became more popular in the 1960s and 1970s, many computer scientists came to the conclusion that programs should always use so-called 'structured' flow-control commands such as loops and if-then-else statements in place of GOTO. However, others believed that use of GOTO did not unconditionally lead to poor quality code and that there are some tasks that cannot be straightforwardly accomplished in many programming languages without the use of one or more GOTO statements, such as breaking out of nested loops and exception handling.
Probably the most famous criticism of GOTO is a 1968 letter by Edsger Dijkstra called Go To Statement Considered Harmful [1]. In that letter Dijkstra argued that unrestricted GOTO statements should be abolished from higher-level languages because they complicated the task of analyzing and verifying the correctness of programs (particularly those involving loops). An alternative viewpoint is presented in Donald Knuth's Structured Programming with go to Statements [2] which analyzes many common programming tasks and finds that in some of them GOTO is the most optimal language construct to use.
The Ada language design took note of the above criticisms, but the statement was included in the language despite the criticisms, mainly to support automatically generated code where the goto might prove indispensable. However, the labels used as the destination of a goto statement take the unusual form of an identifier enclosed in double angle brackets (e.g. <<Start_Again>>) and this syntax is not used anywhere else in the language. This makes it easy to check a program for the existence of goto destinations. The goto statement itself takes the simple form goto Start_Again;