In my mind, CPUs implement subroutines, and, "functions" are but artificial constructs built on top of subroutines. Here are some more attempts to explain this hardware-centric view (see, also, the playlist of short videos in the first article).
De-Spaghettifying Control FlowTowards Asynchronous Programming