Other languages and their implementations of green threads usually have cooperative scheduling or M:1 mapping
Other languages and their implementations of green threads usually have cooperative scheduling or M:1 mapping
Also platforms like Wasm still do Mx1 scheduling without async preemption, where Gosched is required at places.
E.g.: my "transpiled" SQLite driver takes special care to make sure long running SQL queries (and the busy handler) can be canceled with contexts even on platforms without async preemption.
Those are the only mature languages that have all of these features.
A "hyperthread" can schedule work for two OS threads simultaneously on a single core. An M:N scheduler will schedule millions of green threads on as many cores/hardware threads as you give it (typically you'd give it all of them).
I would guess that how well integrated OS threads or green threads are into a language has a much stronger impact on experience & quality.
EDIT: you're also comparing hyper threading itself to the green thread scheduler (M green threads vs 2 logical cores), that doesn't make any sense. You probably want to compare to the OS's scheduler. It will schedule those millions of threads over all the hardware concurrency available too.
I believe Go didn't originally have it, and added it in 2020, 14 years after Haskell.
AFAIK, in the current implementation, Java's virtual threads yields only when they block (cooperative). But the spec allows a JVM to implement them as preemptive.