So, joking aside, a natural question to ask is whether this switching back and forth is a waste of everybody's time
The compiler DAG -> CPU DAG step makes a lot more sense if you view machine code as simply a graph serialization format.
"Instruction scheduling" is the process of deciding what piece of the graph to write next, so that the CPU deserializes the right piece at the right time.
Programming languages are UIs for compilers. It strikes me that humanity may be capable of compiler UX better than "edit a bunch of text files, and get your punctuation right, damn it". That remains to be seen though