but the more correct way is to think of run-time and compile-time as a per-block thing.
(Per-statement, even, in the case of use.)
More than just in the case of use. Certainly "my" statements have separate compile-time and run-time effects. "sub" declarations also have a compile-time impact as do "package" statements (as demonstrated in Object lesson). There may be others as well that just don't spring immediately to my mind.
See Re^5: What is the scope of BEGIN? Or... when does it "begin?" (steps). Each statement has one "compile time" and zero or more "run times". I never talk about the one "compile time" or the one "run time" as that makes no sense to me. I'd not say '"Run phase" starts', for example.
There is behavior that is triggered between when the main script source code has finished being compiled and the resulting non-sub code begins to be run. (Since I've never found a need to use CHECK / INIT blocks, I've never bothered to figure out and internalize how they are really scheduled, however.) But it makes no sense to me to say "CHECK code blocks are run [...] before run time begins" when lots of code has already seen its "run time" (and been run) before that.