Der Unterschied zwischen "gosub" und "call" ist, das "gosub" einfach zu einem Unterprogramm spring und "call" eine Funktion oder Prozedur aufruft. Eine Prozedur ohne Parameterübergabe ist zwar nichts anderes als ein einfaches Unterprogramm, trotzdem sollte man es (Bascom-)sprachlich nicht durcheinanderwurschteln.

Ein Unterprogramm wird einfach mit der Sprungadresse aufgerufen.

...
gosub mach_was
...

mach_was:
... dies und das
return

während eine Prozedur oder Funktion zu Anfang des Programms deklariert wird und Parameter übergeben werden können.

Die Deklarierung als Prozedur und das Ausführen mit gosub ist also eine Mischung, die man vermeiden sollte. Es funktioniert halt nur "zufällig", da keine Parameter übergeben werden. Ob es tatsächlich auch im erzeugten Code zu 100% sauber ist, kann ich auch nicht sagen.

Jedenfalls ist es besser, gleich zu Anfang Unsauberkeiten zu vermeiden, um sich keinen schlechten Programmierstil anzugewöhnen

Definierte Prozeduren kommen sogar ohne "Call" und "Gosub" aus, sehen dann als wirklich wie reguläre Basic-Befehle aus.

Was deinen Code angeht so hab ich mir nochmal dein erstes Listing angeschaut. Wo soll da was per Interrupt passieren? Du fragst in der Hauptschleife doch ständig die Taster ab?