Wasn't it the Pascal convention for the caller to push arguments & return address on the stack rather than the callee?
Languages don't have physical calling conventions, only compilers do (and OSes and standard libraries).
In Pascal both the caller and the callee know how many bytes of arguments there are, so you can do anything you want. In ANSI C with prototyped functions without `...` in the prototype you also have both caller and callee knowing how many bytes of arguments there are, so you can again do anything you want.
If a function is called from more than one place in the program then the code size is smaller if the function does the cleanup than if the caller does the cleanup. If a function is called from exactly one place then it doesn't matter who does the cleanup. If a function is never used then the program is smaller if the caller does the cleanup :p
In pre-ANSI C, or varargs functions, the callee doesn't know how many bytes of arguments there are, so 1) the initial arguments [1] must be in fixed registers or in a fixed place on the stack (relative to SP), and 2) the callee can't remove the arguments or save them somewhere else because it doesn't know how many there really are.
The above is all assuming arguments passed on the stack and allocated and cleaned up at every function call/return.
The modern practice is for the compiler to analyse all the calls a function makes and find the maximum number/size of arguments and at function entry allocate enough space for the maximum number of outgoing function arguments needed (plus saved registers, plus spilled local variables). Arguments to called functions are then not pushed on to the stack (SP never moves) but instead stored at SP+0, SP+4, SP+8 etc etc. Then no one cleans up arguments after a function call -- not the caller and not the callee. The entire stack frame is deallocated at once at function exit.
[1] for example the argument with the printf() format string, though varargs functions can be much more complex than that