None of the means of language can be bad or good by definition.
Recursion allows a programmer to express his thoughts more clearly to everyone (and first of all to the compiler), but the price for this is an understanding of what is happening. You need to understand what a stack is, how it works, what is put on the stack when you call it. You need to have a slightly more developed imagination in order to understand when the recursion stops and what will happen to it during calls. You need to understand why global variables need to be changed carefully and, at the same time, why there should be as few variables as possible in the function (up to reuse).
However, any recursive algorithm can be written without recursion. (Usually using a dynamically expanding array)
The main problems specifically recursion - the inability to use it. Many programmers, looking at the code from https://ru.stackoverflow.com/a/39232/182935, will say that it is correct. In fact - there is a gross error hidden - an exponential rather than a linear increase in the number of operations and memory (well, if you write not on a functional PL).
Also from the classic recursion - the inability to properly set the stack using compilation keys (how often in Java you collected from the command line, for example, or maybe you remember how to start a thread with a large stack).
Therefore, a resume (sorry for being rude), if you ask this question, then do not use recursion, if you realize what you are doing - then this is a very handy tool that improves the readability of the code in a number of tasks and allows the compiler to work and not you in the sense of optimizations.