Calling main() is bad practice because the C++ standard says it's not allowed.
A function that calls itself is called a recursive function. Each function invocation (function call that has not yet returned) usually take up a piece of stack memory so you need to make sure the recursion is not too deep or otherwise you can run out of stack memory, getting a stack overflow. One way to get rid of this limitation is to implement the function using iteration (loops) instead.
No, depends on the problem you are trying to solve. A recursive function can always be implemented as an iterative function (using loops) and vice versa. You should prefer using iteration (loops) most of the time but recursion can be very useful and is sometimes the most straight forward way to implement something, especially at times when working with recursive data structures.