One difference is that with Call the called procedure must be explicitly named, whereas with Run it can be built up by concatenation.
run breaks the call stack. it also allows you to call routines in other (unreferenced) workbooks and private routines. it passes all arguments by value instead of by reference. and as was already said it allows you to pass a string as the routine name. call is generally used within a project unless you need the behavior of run for some reason