Está usando uma declaração 'goto' ruim?

Depois de fazer alguma pesquisa sobre como romper um loop secundário

while (true) { // Main Loop
   for (int I = 0; I < 15; I++) { // Secondary loop
       // Do Something
       break; // Break main loop?
   }
}

a maioria das pessoas recomendou chamar a função 'goto'
Olhando como o exemplo a seguir:

while (true) { // Main Loop
   for (int I = 0; I < 15; I++) { // Secondary Loop
       // Do Something
       goto ContinueOn; // Breaks the main loop
   }
}
ContinueOn:

Contudo; Tenho ouvido com frequência que a declaração 'goto' é uma prática ruim. A imagem abaixo ilustra perfeitamente o meu ponto:

assimQuão ruim é a declaração goto realmente e por quê?Existe uma maneira mais eficaz de quebrar o loop principal do que usando a instrução 'goto'?

questionAnswers(7)

yourAnswerToTheQuestion