Необходимость в goto, множественных return из функции и множественных exit/break из цикла сводится к одному (по крайней мере, к одному) шаблону под названием "укороченное вычисление логических выражений". То есть, идет многоступенчатое, возможно, вложенное вычисление некоторых условий, и на каком-то шаге результат становится известным. Дальнейшие вычисления бессмысленны, а часто, в добавок, вообще невозможны.
Подозреваю, что сама по себе реализация укороченного вычисления логических выражений (речь не о шаблоне, а работе с булевыми переменными) также требует goto / множественных return из функции / множественных exit/break из цикла. Но это только мое предположение, я не занимался этой реализацией.