Aaargh. Of course. Just moments after posting, and I realized I missed something rather significant... (The worst part is that I'm pretty sure I had noticed it early on and started to write something about it, but it apparently got lost somewhere while editing/expanding, and then I forgot about it...)
For both of the with-table options, I missed/forgot that GETDATA always puts the result in R1, while the loader expects to get the load address in R2, so it can use it with IFJMP without having to move it there first.
This means that those options require another instruction, to move the address from R1 to R2, either per call site or in the loader itself.
Thus, the with-table options are always more expensive (in both memory size and clock cycles) than the non-table options, instead of being equivalent.
... I do think that most of the post is still valid, though, including the last section.