ale czy to (wydajność) właśnie jest powodem dla którego nie powinienem korzystać z goto nawet w małych programach?
Nie.
Warunkowe elementy języka (takie jak if, while, for, czasem switch) zazwyczaj kompilują się do warunkowych instrukcji skoku. `goto` to tylko dodatkowy bezwarunkowy skok. A jeśli weźmiemy pod uwagę zdolności optymalizacji kompilatora, to w wynikowym kodzie często nie da się rozpoznać czy w ogóle było w oryginalne wpisane jakiekolwiek `goto`.
W praktyce w niskopoziomowych projektach `goto` jest wręcz czasem używane do pisania wydajnego kodu, który normalniej trudniej byłoby zapisać; na przykład maszyny stanu. Cała główna pętla Pythona to jeden wielki switch mający po kilka goto na każdej gałęzi.
A co do samego procesora:
że rozkazy skoku powodują zmniejszenie wydajności procesora w którym zastosowane jest przetwarzanie potokowe.
Skoki warunkowe są potencjalnym problemem, tak. Ale... w dużym stopniu rozwiązany problem przez branch prediction. (link z przyjemnym opisem https://stackoverflow.com/a/11227902 ).
Skoki bezwarunkowe pod znany adres (odpowiednik `goto`) są względnie bardzo niewielkim problemem dla pipeline'u.