Space: Every invocation of a function call may require space for parameters and local variables. A recursive algorithm may need space proportional to the number of nested calls.
Time: Allocating and later releasing local memory, copying values into the local memory for the parameters, branching to/returning from the function, all contribute to the time overhead.
Fortunately, compilers have become extremely clever nowadays, and, if you follow certain guidelines (see later), they are able to produce machine code that incurs minimal or no overhead.