Function calls are the mechanism by which a program executes a function, passing control from one part of the program to another. They are crucial in programming because they allow for code reuse and modular design, enabling developers to break down complex problems into smaller, manageable pieces. In recursive problem-solving, function calls play a vital role as they can call themselves to solve subproblems until a base case is reached, allowing for elegant solutions to problems that have a recursive structure.