Да, есть среды выполнения, в которых не используются стеки, или, по крайней мере, не наивная модель с одним стеком и инструкциями по загрузке / извлечению процессора. Более новые языки, разработанные для параллелизма / многопоточности, обычно избегают модели с одним стеком. Язык Go является примером.
Одна проблема с "аппаратным стеком" заключается в том, что обработка ошибок может быть сложной, когда стек переполняется (обработчику, возможно, придется использовать пространство стека). Явное ведение стека в куче, как, возможно, связанный список, позволяет избежать этой проблемы, хотя это означает, что переполнение стека сводится к переполнению кучи, а бесконечная рекурсия требует больше времени для обнаружения.