Потому... что выпрыгивать и впрыгивать в цикл по GOTO плохая идея.
Ты зашёл в известную тему, но благодаря удачливости зашёл с другого конца. Обычно происходит наоборот
http://crapware.aidf.org/forum/index.php?topic=3429.msg23483#msg23483Что у тебя? Да всё то же самое. После того как ты вышел из цикла while и добрался до GOTO (стр. 35) на вершине стека как раз оказывается адрес возврата из подпрограммы. Если бы не GOTO end_sub снял бы этот адрес с вершины и вернулся бы куда положено.
Но через Goto ты продлил ему агонию направив внутрь цикла минуя начало. Выполнились строки 25-30 и выполнение дошло до end_cyc. Который должен снять с вершины стека адрес начала цикла и перейти туда (ведь работают окончания почти одинаково), но на вершине стека нет никакого адреса начала цикла, там только упомянутый выше возврат из подпрограммы. Вот туда нас судьба и выбрасывает.
Даже если для тебя сейчас это хорошо и "так и нужно", лучше перепиши по нормальному и так не делай никогда.
Пока скрипт как этот из 40 строк найти причину такого поведения не сложно. Когда скрипт будет в 3000 строк и такие выкрутасы будут в нём повсеместно... ну ты понял. Ты не сможешь быть ни в чём уверен, не зная куда тебя телепортирует в очередном месте.