gotoやgosubと違い、ボタンのジャンプはスクリプトの流れと無関係にジャンプする特殊なものです。
ユーザーはボタンをいつでも押せてしまうのですから、必ずサブルーチン実行中に押されるということは期待できません。
たとえば、 button goto 命令で配置したボタンのジャンプ先に return があると、サブルーチンでないところを実行中にそのボタンをおしたらアウトです。サブルーチン実行中ではないのにreturnに到達します。
ですから、ボタンは gosub でない無条件ジャンプのときには gosub のネストをクリアするようです。
button "test",*onbutton
lv=0
*main
title "return " + lv +" times"
gosub *sub
*sub
stop
*onbutton
lv++
goto *main
returnに到達することなく つぎのgosub に行き当たったとき、gosub はネストします。
このネストは、HSPでは127回まで。
つまり、returnせずに 128回目のgosubに行き当たるとエラーになる仕様のはずです。
このスクリプトでは、ボタンを押すと最初に戻って同じサブルーチンに入ります。
つまり returnなしで再度 gosub に入ります。が、128回以上いけるはずです。
また、ボタンの処理の中で return しようとするとエラーになるはずです。
つまり、button命令でジャンプするとき、HSPはサブルーチン実行中だったということを忘れます。
…しばらく扱ってるとそのほうがいいって思えるかもしれません。
サブルーチン実行中にボタンが押されて、その処理の先にreturnがなかったらおかしくなるとか面倒をみなくてはならないよりは、ボタンを押されたら何も考えずにボタンの処理をして、適当な処理に復帰できるほうが。。。