Потому, что избыточное использование goto уменьшает надёжность кода и затрудняет его понимание / модификацию. Использование goto провоцирует написание спагетти-кода, в котором очень сложно разбираться.
В языке C (без плюсов) goto может использоваться для обработки ошибок, но в C++ есть структурные исключения (try-catch), которые делают бессмысленным использование goto в этих целях.
Единственное, где goto имеет смысл использовать - это имитация многоуровневого break (завершение сразу нескольких вложенных циклов), отсутствующего в C/C++. Но намного лучше обернуть эти несколько циклов в функцию и делать return: от разбиения большого монолита на небольшие функции код становится куда понятнее.
P.S. Чаще всего goto используется не в коде, написанном человеком, а в коде, созданном всяческими генераторами по заданному набору правил. Программу, генерирующую код с goto, написать намного проще, чем программу, генерирующую код без goto.
В качестве примера просто посмотри, сколько goto в модуле парсинга даты/времени в исходниках PHP:
- Вот это - шаблон, описывающий структуру и способы обработки даты/времени:
https://github.com/php/php-src/blob/master/ext/date/lib/parse_date.re - А вот это - готовый C-код, автоматически сгенерированный по шаблону: https://github.com/php/php-src/blob/master/ext/date/lib/parse_date.c