mod_perl marries Perl to Apache. It embeds the Perl interpreter in an Apache module to make it possible to write request handlers for Apache in Perl, rather than writing them as modules in C. Compiled Perl code is kept in memory once it is loaded, eliminating the overhead of CGI scripts and opening up control over all stages of Apache's request processing rather than just the content generation phase.
mod_perl comes with a variety of stock request handlers. Perhaps its most popular use is for those stock request handlers (Apache::Registry and Apache::!PerlRun?, as well as several specific variations thereof) that attempt to offer its benefits to any Perl CGI script simply by adding a few lines to the Apache configuration. No adjustment to the scripts is required, unless they were written in really dirty style. (Note however that rewriting them as true mod_perl request handlers still offers better performance at slightly lower memory consumption; this is a question of tradeoffs to be made.)