Weil fast alle Programmiersprachen deutlich bessere Konzepte im Bezug auf Sprünge - oder allgemein Kontrollstrukturen - bieten, die ein strukturierteres Arbeiten erlauben und keine, bzw. sehr wenige, schlechte Nebeneffekte haben, welche - wie goto eben - Bugs verursachen und schlecht wartbaren Code erzeugen.
Die einzige Ausnahme dürfte hier C sein, denn dabei zeigt sich sehr gut, wie man wirklich schön sauberen und aufgeräumten Code schreiben kann, der in dieser Form ohne goto gar nicht möglich wäre.
Deshalb nutzen auch so ziemlich alle großen OpenSource-Projekte, die auf C setzen, die gleichen Techniken mithilfe von goto, die du auch in jedem Kernel eines modernen Betriebssystems, oder allgemein in der Treiberentwicklung, wiederfindest.
Aber wie gesagt, C ist hier die einzige Ausnahme, zumal man sich dabei streng an selbst auferlegte Regeln halten muss, um sich mit goto nicht in den Fuß zu schießen.
Bei vielen Basic-Dialekten findet man ebenfalls goto, aber wenn diese älter sind (QL-Basic, Quickbasic, etc.) hat man eben keine besseren Werkzeuge zur Hand und ist zwangsläufig auf den Einsatz von goto angewiesen. Neuere Basicdialekte hingegen haben vernünftige Kontrollstrukturen, die man in jeder modernen Hochsprache wiederfindet, und deshalb gibt es bei VisualBasic oder Gambas auch keine Ausrede für den Einsatz von goto.
Bei verschiedenen High- und Lowlevel-Assemblern gibt es meist nur "nackte" Sprünge, also quasi nochmal etwas extremer genau das, was goto in Hochsprachen so macht, aber Sprunginstruktionen kann man sowieso nicht mit goto gleichsetzen.
In Shellskripten gibt es oft nicht die Möglichkeiten einer Hochsprache, und meist auch irgendeine Form von goto, ich habe aber persönlich noch nie dazu greifen müssen und immer elegantere Lösungen mithilfe von Schleifen, Bedingungen, Funktionen, usw. gefunden.
C++ hat seine Wurzeln zwar in der C-Welt, aber wurde stark weiterentwickelt, weshalb es bei C++ - im Gegensatz zum guten alten C - keinen Grund gibt, goto einzusetzen. Bei C++ kann man wesentlich ordentlicheren Code mithilfe von RAII und Ausnahmebehandlung schreiben, was meist keinen nennenswerten Overhead hat.
Auch bei Java, C# oder Skriptsprachen wie Python, Ruby, etc. setzt man auf Ausnahmen zur Fehlerbehandlung. Bei Go, Swift und vielen anderen Sprachen gibt es noch weitere Interessante Konzepte, die langsam ihren Weg auch in andere Sprachen finden.
Fast alle Hochsprachen bieten auch einen objektorientierten Ansatz, sodass man Code schön kapseln, und die sog. zyklomatische Komplexität sehr elegant reduzieren kann.
Wie gesagt, C ist die einzige Ausnahme, bei der das alles nicht geht, und aus diesem Grunde ist goto bei C auch nicht bloß erlaubt, sondern sogar sehr empfehlenswert, wenn man auf ordentliche Codequalität und sichere Programmierung achten möchte.
Es hat sich allerdings leider eingebürgert, goto blind zu verteufeln, sodass die meisten Einsteiger und sogar viele Profis von goto auch bei C abraten, ohne sich jemals wirklich Gedanken darum gemacht und sich damit beschäftigt zu haben.
"goto ist böse" hat sich zu einem Dogma entwickelt, was oft zwar wirklich berechtigt ist, aber eben auch nicht immer zu 100%.22
Falls du jetzt aber denkst: "Oh, dann kann ich ja beruhigt goto einsetzen" ... Nein, solltest du nicht! Da du noch Einsteiger bist, lerne erst mal wie man mit all den anderen Kontrollstrukturen umgeht, falls du überhaupt C nutzt. Falls nicht, hat sich die Frage nach goto sowieso erledigt. :)
Fazit: Bei C ist goto sehr gut, WENN man weiß, was man tut ... ansonsten ist goto vermutlich zu 99,999% schlecht. :)