Register post status, exclude from searches

If it was me, I would probably just override the queries on the individual templates that you are trying to hide “ghosted” posts on. However, I can see how in some situations it would be better to override the main query.

How about:

function public_query_published_only($query) {
  if ( !$query->is_single() && !current_user_can('manage_options') && !is_admin() ) {
        $query->set('post_status', array('publish') );
        return $query;
    }
}
add_action( 'pre_get_posts', 'public_query_published_only' );

So: if the query is not for a single post, and the user isn’t a logged-in user, and the query isn’t from the admin interface, only show posts with a status of “publish”. (Of course, you could also add any other statuses that you deem to be query-able.)

Because there is not an exclusion filter for post status, this is the best I could think of without resorting to SQL.