As i said in the other topic, i wouldn't use Timer 0 interrupt for a precise delay timer. Why? because if you want a specific time interval you have to reload TMR0 to a specific value inside the interrupt routine.
If you use, for example, TMR2.. TMR2 auto-resets and generate an interrupt when it matches the period register PR2, so by playing with the prescaler and PR2 value you will get a constant interval between two interrupts.
Back to the topic: clock structure.
The 18f2550 clock structure isn't really that complicated anyway... though it may appear confusing.
You can ignore the usb part for now.
You said you have a 16MHz oscillator. Almost all the parameters are set in the configuration words, for example by setting the CPUDIV bits you can divide the primary oscillator frequency by 1:1 to 1:4
Let's say you configure the divider to be 1:4
16 MHz in -> 4 MHz out. The cpu will be clocked at 4 MHz. Then, in PIC16/18 the instruction clock is 1/4 of the clock frequency, so 16 MHz divided by four (CLKDIV), divided by four (Inst clock), 1MIPS -> 1 Million instructions per second. 1us per instruction
In this example, let's try to get TMR2 to generate an interrupt every 1ms
Fig 13-1, page 138 of the datahseet you have TMR2 block diagram. TMR2 frequency is Fosc/4 (the instruction clock), divided by the prescaler.
if you divide the clock by 4 TMR2 clock will be 250kHz, if the timer is set to count 250 times between each interrupt the interrupt frequency will be 1kHz so one interrupt every 1ms so PR2 will be 249 (count from 0 to 249)
T2CON = 0;
T2CONbits.T2CKPS = 1;
PR2 = 249;
T2CONbits.TMR2ON = 1;
PIR1bits.T2IF = 0;
PIE1bits.T2IE = 1;
toggle an output in the interrupt routine, clear the flag. If you don't get the desired frequency it can only mean that the clock is NOT what you expect