OS threads have ~1-8MB stacks (the kernel pre-allocates). Virtual threads (Java Loom, goroutines, Erlang processes) start with a few KB and grow as needed. Massive memory difference at 100K+ threads.
Virtual threads enable "one thread per connection" at scale — what was once unimaginable now works for 1M concurrent users on commodity hardware.