I get why someone might say don't call functions, but it seems a little extreme. I would say: Know the functions being called.
Regarding
There is therefore no guarantee that the ISR will have finished servicing one interrupt before the next interrupt of the same type occurs.
That is exactly the job of the programmer and system designer, to guarantee such things. If they can't be guaranteed, then perhaps a different solution is warranted.
Regarding nested interrupts, that is for sure a maze of twisty little passages, there is a non-trivial price to be paid. Maybe it can't be avoided for a given application. But it's the 80/20 rule (or maybe 95/5 etc.), it's not needed for many real-world applications. Why go there if there is a simpler solution. Simple is good -- the point is not to design in as much complexity as possible. I'm sure it's a great intellectual exercise just the same. We'll leave that exercise to the reader ![]()