I'm guessing you have that about right. In C at anyrate, I'd consider a direct function call as being calling the function by name (compile time), whereas indirect as calling the function using a function pointer (runtime). Other languages (COBOL for one) allow you to call programs (similar to functions in other languages) by name at run-time, so you can build up a string in a variable and call that, so the story is a little more complicated than name vs pointer.
For indirect function calls, there are tricks you can use to determine the target when doing code analysis, but they're rarely suitable for a compiler, so the latter is almost impossible to optimise. For direct calls, you can do all sorts of optimisation.
I could have course be barking up the wrong forest.