TMR0 Inaccurate Result
I would expect the discrepancy comes mainly from your "while(TMR0IF != 1)" checks. Even after the interrupt flag is set, you still have to complete the test to see if TMR0IF is 1. This will take several instructions (on the assembly level) which takes time, as well as initializing the timer (no, this will take more than one "tick" to complete) and the instructions required for setting/clearing RB1.

If you want absolute accuracy you really shouldn't be using C as it is much more difficult to account for timing. One line in C could take a dozen instruction cycles. It's much easier to account for the timing if you use ASM (though that's the ONLY time I would ever consider using ASM, personally).