no es porque la logica sea con gotos, es porque una vez se compila el .c el compilador lo pasa a asm todo funciona con gotos a pesar de que "no se vean". Para que me entiendas un if(variable==3) cuando se compila se convierte en:
(codigo de asm)
resta a variable: 3
si el resultado es 0 entonces GOTO a determinado punto del programa (en este caso seria lo que estuviese entre los { }) en caso contrario el programa sigue su curso.
El tema esta en que existe un numero determinado de instrucciones, con esas instrucciones se debe hacer todo, aunque tu pongas cosas raras en C al final todo se convierte en un codigo asm sencillo, aunque tu uses funciones, for, while, do, .... todas estas funcionan con goto.
Como ya he dicho, no hay ninguna repercusion utilizar el goto, pero esta mal visto porque no es la forma de usar el C, es decir, estas usando el C como si fuese ASM.