Drupal is notorious for producing way, way too much markup in an attempt to make absolutely every individual page element individually themeable. Whether you think this is 'good' or 'bad' completely depends on your opinion, there are probably as many advantages as disadvantages.
Every time I build a new theme these days I first drop in some heavily stripped-down template overrides.
For example my standard node.tpl.php simply looks like this:
<?php echo render($content); ?>
field.tpl.php file looks like this:
<?php foreach ($items as $delta => $item): ?>
<?php echo render($item); ?>
<?php endforeach; ?>
<?php if ($content): echo $content; endif; ?>
Those are the absolute extremes in stripping out the tags, my template files very rarely stay this basic once the project gets going. But using this method I can build upon the bare content output and just wrap what I need to to style that particular theme. It gives me enough control over the markup while keeping as clean a DOM as I can manage.
The downside to this method is that some contributed modules contain their own CSS files that target the generic classes that Drupal outputs. These will obviously stop working if you've stripped those tags out, so there's a good amount of manual intervention required.
A good example of this are the field types provided by the media module. They rely on the surrounding tags for styling, and look awful when removed. I usually get around this by making field specific template files (e.g.
field--media.tpl.php) which have all of the original markup in them.