I haven't seen anyone suggest this one yet, but it seems the logical solution: HTML::Strip. From the POD for that module, you'll see this simple example:
use HTML::Strip;
my $hs = HTML::Strip->new();
my $clean_text = $hs->parse( $raw_html );
$hs->eof;