Yes I think the clock used by .net framework timers only operates around 16ms intervals so your results do not surprise me. Though your 1 tick interval test sounds like a bug. What OS, Rx version, .Net versions are you using? I'll see if I can repro the problem.
For the 0 tick case, I think you are getting high throughput because the Rx scheduler is detecting the work is due "now" and is just launching it immediately and bypassing the .Net timers to schedule the work.
It is fairly easy to use Observable.Create to create your own version of Interval which uses a higher resolution timer. A bit more complex but ultimately more useful would be to write a new IScheduler implemention that used a high resolution timer. Then you could pass that scheduler to all of the existing time-related Rx methods.