Reifying the stack makes implementing lexical capture significantly easier, but has real performance costs. It can also enable (relatively) easy extension to coroutines or other language constructs that depend on stack manipulations, non-local returns, or tail-call optimisation. I have written interpreters that did both and I'll continue to do so; neither is fundamentally better than the other.
For a language that is going to have any of these features, a reified stack and reified stack frames are worthwhile. In a language that doesn't have use for any of these things it is probably not worthwhile. The implementation work is not too complex, but not completely trivial, and probably not going to be a make-or-break factor.
The run-time costs of this bookkeeping are meaningful, especially if the interpreter is allocating garbage-collected objects, but even for a flat stack. However, performance often isn't a major concern for interpreters. For a high-performance interpreter tighter coupling with the facilities of the platform is very valuable, and whether that implies a reified stack or not is more specific than this general advice can get.
In cases where you don't have a use for the reified stack, the interpreter code is liable to be easier to follow and maintain if it just leverages the existing call stack of the host language, and so looks and behaves like an ordinary program. I would only implement reification when one of those properties was desired, but I wouldn't hesitate to do that when the situation arose.
The other substantial advantage of reified stack frames is less related to the interpretation or language itself: it's a convenient place for instrumentation. Either for your own debugging of the interpreter, or as a language feature, you can intercept variable assignments or reads in one place, log lifetimes of function scopes, or interfere with returns. This isn't the only way to get those features, but it may be a convenient one.