Problem with removing post tags programmatically

Your code looks little clunky, http_build_query() is definitely not meant for such. Also what you are fetching is not simple array, but array of tag objects.

My take:

$post_tags = wp_get_post_terms( $post_id, 'post_tag', array( 'fields'=>'names' ) );
$pos = array_search( 'tag-to-be-deleted', $post_tags );

if( false !== $pos ) {

    unset( $post_tags[$pos] );
    wp_set_post_terms ($post_id, $post_tags, 'post_tag');
}