Stack memory questions
Yes, they are stored on the same stack.  Yes, that sequence of code could cause problems.  It is up to the compiler (or the assembly language programmer) not to do that.

A compiler will typically ensure that the start of the function pushes some number of words (say $n$ words), and that the end of the function pops off exactly as much as was pushed -- no more, and no less.  As long as you do that, the return address will be left undisturbed and the RET will return back to right after the CALL.  If you don't follow that kind of convention, then all sorts of strange things can happen, exactly as you say -- so make sure you follow the convention.