Yes, currently compilers use stack like this. But nothing is preventing compiler writers to use/allocate stack differently.
For example, LLVM recently implemented "SafeStack" for security purposes. It allocates and uses separate stack for variables that cannot be statically verified how they are accessed (like arrays). This way if somebody will pass bad data into function and buffer overflow will happen, it won't overwrite return address. So nobody will be able to jump to arbitrary location thus preventing many exploit techniques (like ROP).