Question about proper use of wp_redirect?

It seems this would just be a function of your theme. If you don’t provide links to single posts, categories, etc., then as far as your visitors are concerned, those things effectively don’t exist.

If you really want to prevent access to things, you can’t redirect in a template as headers have already been sent. You could maybe add an action to pre_get_posts, inspect the query, and redirect at that point.

Here’s a simple example:

function wpse30196_pre_get_posts( $query ) {
    if( $query->is_home || $query->is_tag ):
        return;
    else:
        wp_redirect( home_url() );
        exit;
    endif;
}
add_action('pre_get_posts', 'wpse30196_pre_get_posts');