This argument:
the programmer has to wonder for every function/procedure where it is used
goes against this argument:
I fully _expect_ the programmer to read the code
There is no contradiction there. If the function/procedure is _not_ nested then the programmer - who is supposed to read the source program - has to _count_ and _remember_ if each and every function is called once or more. If the function/procedure is nested, it's obvious it is invoked in only one place and it is also obvious which function/procedure uses it.
... which has nothing to do with the advantage/disadvantage of certain techniques.
It does because, some programming "techniques" burden the programmer with having to remember details a programmer shouldn't have to.
The only reason to nest a procedure is when it is used only once in a project (which in most of my projects doesn't happen often) and even then there are ways to make the association obvious, e.g. using obvious naming.
That's not the only reason. A good reason, one that should be used as often as possible, is to group statements into functions/procedures so that the group of statements can be given a name that reflects its purpose. It is also an excellent method of having a function/procedure "mainline" that reads like pseudo-code because all the code sequences are logically grouped and appropriately named.
Well organized code with procedures at the module level is by no means spaghetti. You make it sound like procedures are similar to the goto-statement to stress the importance / necessity of nested procedure support, which in my opinion is greatly exaggerated.
The essence of spaghetti code is not being able to easily determine what causes the code to be executed. A program that is just a large bag of functions/procedures without any evident/obvious execution connections between them is spaghetti code. Bagging code into functions/procedures does not avoid the essential spaghetti code problem.
When functions/procedures are nested into the function/procedure that uses them, where they are used is _obvious_ and how/when they are used is, more often than not, easily established by inspecting the mainline of the root function.
ETA:I agree with Thaddy that grammar has little influence on a compiler's ability to generate/optimize code. Much more important is how the compiler itself is structured, which allows/disallows it to see the wider context of specific code targeted for optimization.
In that case, I disagree with you both.