Help with WordPress Query

After calling get_recent_posts() (or any other loop query), you typically have to run a foreach or while loop to cycle through the posts. So, you’ll need to change this:

    <?php
    $args = array( 'tag' => 'featured', 'posts_per_page' => '3' );
    $recent_posts = wp_get_recent_posts( $args );
    ?>

<!-- Your HTML and WordPress template tags here. -->

            <?php wp_reset_query(); ?>

to this:

    <?php
    $args = array( 'tag' => 'featured', 'posts_per_page' => '3' );
            $the_query = new WP_Query( $args );
            //start the WP_Query loop
            while ( $the_query->have_posts() ) : $the_query->the_post();
    ?>

<!-- Your HTML and WordPress template tags here. -->

            <?php endwhile; //end the WP_Query loop ?>
            <?php wp_reset_query(); ?>

Note that if you’re ever wondering why a WordPress function isn’t working as expected, you can find that function’s entry in the codex and (usually) see an example of use in practice.
http://codex.wordpress.org/Function_Reference/wp_get_recent_posts