How to add independent “Tags” to Custom Post Type?

tag is a reserved term because it’s the native query var for querying by slug with the post_tag taxonomy (see WP_Query Tag Parameters).

You could technically register your taxonomy with tag as the taxonomy name, however– you’d have to change the query_var argument to something other than tag (setting it to true uses the taxonomy name, it also accepts a string).

Anyway- it’s probably safer and just all around better to use book_tag.

As for the rewrite slug being tag– if the native post_tag taxonomy is also using this slug, your new taxonomy will capture all of those requests. WordPress will query for the slug in your book_tag taxonomy instead of post_tag.

There is a little trick to fix this- check if the requested term exists in post_tag, and make WordPress query there instead. The obvious caveat here is that you can never have terms in both taxonomies that share the same slug. To do this, we hook request, which fires before WordPress does any of its own query parsing:

function wpd_modify_tag_requests( $request ) {
    // is this a book_tag request?
    if( isset( $request['book_tag'] ) && 1 == count($request) ){
        // does the slug exist in post_tag? 
        if( get_term_by( 'slug', $request['book_tag'], 'post_tag' ) ){
            // move slug over to tag, and delete book_tag
            $request['tag'] = $request['book_tag'];
            unset( $request['book_tag'] );
        }
    }
    return $request;
}
add_filter( 'request', 'wpd_modify_tag_requests' );