The timing and preemption problem is why I used SCHED_FIFO when I wrote a user-space front-panel LCD driver for an embedded system, long ago.
The program runs SCHED_OTHER as normal, then escalates into SCHED_FIFO at prio 95 (something like that) to program the data ports, then falls back.
I know that kernel interrupts and similar things may interfere but it was never a problem in practice. The LCD's timing requirements were not overly strict, just that you couldn't go away and ignore it for tens of milliseconds.