It doesn't matter how you define them. All threads allocated from the Tomcat thread pool are supposed to be identical. They won't be identical if some of them have child threads dangling from them, which would be the case if an earlier thread user had spawned them.
Technically the "no threads" rules would be satisfied in the case that all children had terminated and been released prior to returning the thread to the pool, but Http Service functions are supposed to be quick in-and-out - being returned to the pool in milliseconds, and that tends to rule out child threads.
Longer-term processes aren't uncommon, but they have to be spawned by something like the application listener or a
servlet's init() method (which doesn't run under a pool thread - but is no longer recommended as a thread-starter, regardless).
Simply spawning threads isn't sufficient to cause Tomcat to bog down, but if the child threads pause the parent thread, that would definitely gum up the works, and all sorts of mayhem can result from pulling "dirty" threads from the pool.
The secret of how to be miserable is to constantly expect things are going to happen the way that they are "supposed" to happen.
You can have faith, which carries the understanding that you may be disappointed. Then there's being a willfully-blind idiot, which virtually guarantees it.