I’m not sure I can give an exhaustive answer. One of the aspects of separate contexts is isolation. The address space of one context is isolated from the address space of another context. There might be some situations where that is desirable.
Another aspect of multiple contexts might be called resilience. If I have 2 contexts, and one of them becomes corrupted, the other can still function normally, without requiring a device reset or any other behavior that you would need with the CUDA runtime API to restore behavior.
It might also be useful to have a separate context for a dynamically linked library. In fact, a library might create its own context.
I’m sure I can’t imagine all the cases where multiple contexts might be useful.