It’s right that you might have to separate cpu intensive work to a different dispatcher, but that should typically not be the same as the dispatcher for blocking IO because the task are typically very different in nature.
For blocking IO it is fine to have more threads than cores, since those threads will be mostly waiting.
For cpu intensive work it’s most efficient to limit the number of threads to the number of cores. Perhaps slightly less than number of cores to give the system some room for doing other things.
There are also other ways than the dispatcher to limit number of things running in parallel, such as a limited number of actors or streams with limited parallelism. In that case it’s fine to run those things on the default-dispatcher.