Und genau das erste ist ein Negativbeispiel.
Cleanup gehört in den Destruktor und dann arbeitest du einfach nicht mit Return Werten, sondern mit Exceptions.
Dann wird das Cleanup direkt beim Stack Unwinding übernommen.
Diese ganze if(error) Struktur macht den Code unübersichtlich und schwerer zu verstehen.
Das zweite ist ebenso ein Design-Fehler, man sollte möglichst wenig Sprünge in seinem Code haben. Ein break wäre da genau so unschön btw.
Das wäre entweder auch ein Fall für Exceptions oder ggf. ne extra Schleifenbedingung.
Klar, man sollte solche Sachen nicht vollständig verdammen und für alle "Schlechter-Stil-Beispiele" gibt es immer Ausnahmen, sonst wär es gar nicht in der Sprache geblieben (wobei goto eher aus Kompatibilitätsgründen drin ist), aber goto ist defintiv obsolet und lässt sich in so gut wie jedem Fall umgehen. Die wenigen anderen Fälle könnte man evtl einfach umdesignen und dann bleibt nur noch ein Minimalteil, wo ein goto wirklich Sinn macht.
(Bei unions sieht das natürlich anders aus, bei Netzwerk Interaktion kann das zugegebenermaßen ganz praktisch sein, WOBEI: eigentlich bietet C++ für Bitmasks eigene Container. Die allermeisten union Beispiele, die ich kenne, sind C Beispiele, die im Grunde native C++ Mechanismen immitieren (und dein goto Beispiel immitiert zb. eine Art Destruktor/finally Block Mischmasch). union und goto sind beide eher so C Relikte, die man größtenteils in C++ durch zumindest gleichwertiges ersetzen kann. union akzeptiere ich da aber noch eher als goto

)
Ich würde aber sagen, wenn es da noch was zu diskutieren gibt, sollten wir das lieber per PM oder per Profilnachricht tun (oder nen eigenen Thread aufmachen), da das hier nicht mehr so wirklich hingehört.