The new design changes in Change I1506de77 reminded me of an earlier idea that came to mind. I don't know how simple it might be, and PhpTags is still useful without it, but it would add some flexibility for how it can be used.
If it were made possible to transclude templates inside a PhpTags expression, then things that are done in several PhpTags templates could be put in a separate, common template. "Magic expressions" could then transclude templates for use as magic subexpressions.
PHP allows files to return values. If transclusion support is added in PhpTags, then maybe this could be useful for templates used as "subexpressions". And to pass arguments to a template, maybe include/require could also be extended to take them as extra arguments. For example:
<phptag> ... $something = include( "Template:Get_something", [ 'foo' => 'bar', 'baz' ] ); ... </phptag>
The idea here is to pass arguments in an array which is used to make $argv for the included template. (I think this may be the simplest way to pass arguments.)
A big design change that would be needed is for PhpTags to be able to store several states, as a stack. The runtime state for the first template would need to be stored while a second state is used for running an included template. (And a third state for a template included in the included template, etc.)
I was reminded of this because the change you're making seems to move out some static things from the runtime. Maybe if this feature is added, a further change would be to make the runtime have non-static data, and then PhpTags can use a stack of runtime instances?
Anyway, this seemed like a neat idea, but I don't know how much work it would be or if it would be worth it. Also, if it is done, maybe there are better approaches than the above.