OK, I am coming from a PHP background (I can already hear mumblings around ;)) and find CGI.pm (or any other HTML done in a similar way for that matter) unintuitive and ugly. Whenever I am doing some web-work I use templates for HTML. That way you can have a very clean hand-crafted HTML and no ugly print statements. Most of the time only a few things on a page are generated dynamicly, so it is very easy to use things like this:
use HTML::Template;
# ... first send header, update counters, whatever ...
# then comes HTML rendering phase:
my $template = HTML::Template->new('template.html');
# set some parameter
$template->param('counter', $counter);
# print it all
print $template->output();
It really separates all the business logic from display, so you can concentrate on interface with databse or whatever while leaving the HTML for a template. Well, at least I like it ;)