Recursive descent parsers can contain Pratt parsers but they don't need to. For example you can parse s-expressions with recursive descent but there's no need for Pratt parsing.
And Pratt parsing is not the same technique as general recursive descent.
So the article you linked is about a specific subset of parsing expressions, which is useful yes, but not the same category as OP's post.
And pratt parsers can be contained in recursive descent parsers but they don't need to either.
(Stacks are an implementation detail. Only some languages implement function calls with stacks.)
Programs compiled with GHC do use 'the stack', but for pattern matching, not for function calls. Whether 'stack frames' (ie the information associated with a function invocation) go on the heap or elsewhere is a bit complicated. Especially since the compiler does so much analysis and optimization.
Also eg, an implementation of Unlambda (based on SKI-calculus) wouldn't necessarily have a stack either.
Something like Datalog wouldn't really have a call stack either, but that's deliberately not a Turing complete language. (But neither is Agda a Turing complete language, but it's still general purpose.)