Is the compiler/assembler actually referencing ZP as word addresses each time? :/
If a label is tagged as a ZP label, then (IIRC) it will usually use ZP addressing ... except inside procedures, when all the rules change because nested label space handling is horribly broken in CA65.
BUT ... any label in $00xx range is automatically addressed as ZP if possible, and anything in our $20xx range is word-addressed.
I proposed a couple of quick-hack workarounds ... but they would still break in nested label spaces.
CA65 needs some serious work ... and the current maintainers are treating the source code like the Holy Grail.
Another reason for me to mess with HuC ... it *can* be messed with, and the only reason that its code sometimes sucks vs CC65, is because of specific CC65 peephole optimizations that could (not trivially, but with some work) be applied to HuC.
Both compilers are based off of Ron Cain's original Small C.