When does save_post hook fire on post save/update

save_post is fired at the end of wp_insert_post() which is the core function that’s run whenever a post is inserted or updated (wp_update_post() calls it internally). This includes when the post is updated via the classic editor and the block editor (Gutenberg), as well whenever it’s updated via the REST API. The only reason it wouldn’t fire is if the post was being updated via SQL directly (via a plugin or otherwise), or when only post meta is updated via a function.

So no, this is not the expected behaviour. If your function isn’t firing then it could be interference from another theme or plugin, or it could be an issue with the function itself, but there’s not enough information in the question to say either way.