@jann Another use case is periodic polling. Yet another is dealing with latency constraints, for example, compute it the hard and accurate way, but if that takes too long, compute it more quickly and less accurately. Another involves needing to do things that are not permitted in a restrictive context (e.g., interrupt handler), though things like irq work are better on architectures providing this.
All that aside, yes, I have seen timeouts used in cases where investing a little more thought might have provided a better solution. Then again, the same is true of pretty much all other facilities provided by the Linux kernel. ;-)