Create new custom post and post category of same name

You are way off, if you say that wp_publish_post() has been renamed to {$new_status}_{$post->post_type}. The latter actually is a hook, while the former is a function. Where the latter is part of the former, because it’s part of wp_insert_post.

The hook {$new_status}_{$post->post_type} is part of wp_transition_post_status() – additionally see the source. You might want to take a look at the codex article about the Plugin API to learn more about hooks in general. Additional specific information regarding hooks applicable when publishing, saving and so on posts – or post types – can be found at the entry about Post Status Transitions, besides above linked wp_transition_post_status(); and – as always – the source.

Regarding the code you posted, there should be no need to do my_publish_product() – or at least none that can be seen from your code. Your posts from the post type product are getting created, saved, updated and so on just fine I imagine.
You can just hook my_wp_insert_post() directly to the hook most suitable for your needs, following your code the wp_insert_post filter. Which is part of the wp_insert_post()source – and the wp_publish_post()source – function. Last but not least take a look at the usage of add_action().

Below code exemplary outlines how to do it:

add_action( 'wp_insert_post', 'my_wp_insert_post', 1, 3 );
function my_wp_insert_post( $post_id, $post, true ) {
    //your code
}