Well I have a certain amount of sympathy. I was doing a VGA monitor here and I have timing issues. And I wanted to receive I2C data for updating the screen.
In the end I put up with a bit of flicker.
The low-level I2C stuff looks so complicated (all those modes) that I haven't looked at exactly how the hardware registers work.
Your approach looks like it might work. There could be timing issues. I don't know whether you might get away with disabling interrupts during the time-critical part, and then enabling them and letting the I2C interrupts through.
Your code in getTwiByte looks to me like you have a loop waiting for stuff, so I'm not too sure how that is faster than interrupts. Interrupts have an overhead (around 1.5 to 3 uS) but so does sitting around waiting.