...the key semantic that makes fork() so useful is that it allows inheriting the current execution environment to the child.
This is a circular argument. With threads, you don't need to "inherit the current execution environment"--you already have it!
That's not the point. Ignore the choice of “inherit” per se; that is purely wording. I'll try to state it more neutrally yet:
You want to be able to launch a new branch of parallel execution at some point in the program and you want both branches to start out with the same environment and state. You can just do that with processes when you have fork(); you need threads when you don't.
Makeshifts last the longest.