Your opponent is mostly correct. Blockers are declared all at once and once declared can't be changed unless cards specifically say to do so (like creating a token that comes in blocking like Flash Foliage or removing the creature from combat with Labyrinth of Skophos). The rules for blocking are section 509 of the comprehensive rules:
509.1 First, the defending player declares blockers. This turn-based action doesn’t use the stack. To declare blockers, the defending player follows the steps below, in order. If at any point during the declaration of blockers, the defending player is unable to comply with any of the steps listed below, the declaration is illegal; the game returns to the moment before the declaration (see rule 725, “Handling Illegal Actions”).
509.1a The defending player chooses which creatures they control, if any, will block. The chosen creatures must be untapped. For each of the chosen creatures, the defending player chooses one creature for it to block that’s attacking that player or a planeswalker they control.
You choose all the creatures you will block with all at once, as an action that doesn't use the stack and thus cannot be responded to (though there is priority both before declaring blockers and after it before damage happens). Further the actual dealing of damage is covered in section 510 of the comprehensive rules:
510.1 First, the active player announces how each attacking creature assigns its combat damage, then the defending player announces how each blocking creature assigns its combat damage. This turn-based action doesn’t use the stack. A player assigns a creature’s combat damage according to the following rules:
510.2 Second, all combat damage that’s been assigned is dealt simultaneously. This turn-based action doesn’t use the stack. No player has the chance to cast spells or activate abilities between the time combat damage is assigned and the time it’s dealt.
All the damage assigned is dealt simultaneously - this means that at the same time the one rhino is doing 5 damage to your hydra and your hydra is doing 5 damage to the rhino, the other 2 are doing 10 damage total to you - even if you could add blockers after this point they would be added after the damage has already been done.
The term dies as used in magic is defined in the comprehensive rules too:
700.4 The term dies means “is put into a graveyard from the battlefield.”
And this isn't instantaneous either, just handled automatically by the game rules for state based actions, there's a few that matter here from the comprehensive rules: (704.3 cut short to remove what does not apply here)
704.3 Whenever a player would get priority (see rule 117, “Timing and Priority”), the game checks for any of the listed conditions for state-based actions, then performs all applicable state-based actions simultaneously as a single event.[...]
704.5 The state-based actions are as follows:
704.5a If a player has 0 or less life, that player loses the game.
704.5g If a creature has toughness greater than 0, it has damage marked on it, and the total damage marked on it is greater than or equal to its toughness, that creature has been dealt lethal damage and is destroyed. Regeneration can replace this event.
Since you said the other two rhinos were enough to kill you, meaning your life total was 10 or less, at the same time the hydra and rhino are sent to the graveyard, you lose the game, so the hydra's trigger never even gets put on the stack and no tokens are ever created.
The point where your opponent is wrong is where he said "things go to the graveyard, at the very end phase." Things to to graveyard immediately when a destroy effect happens like Doom Blade or Wrath of God or nearly immediately like in this case, when they are destroyed as a state based action. This never waits for the end phase. They may have meant the end of the combat phase, which is pretty close to correct in this situation, technically players get priority at the end of the combat damage step.