Reading the article on that wiki, it says that the NPCs could not be removed because the game could break.

This makes me think that when checking the sequence of events, the game engine also checks if there has already been an encounter with a specific NPC, and the status is saved on a property of the NPC itself.

This is speculation of course, but I think it's likely this way, because it's faster to check on a specific NPC a flag saying "already_encountered" rather than going through a list of encountered NPCs and checking for that single one.

Why does this matter? Because if the NPC was actually removed from the game, the engine would not be able to check the encounter status after said NPC died. So, one solution is to not remove them. But of course they have to not be encounterable (is it a word?) again.

Npw, suppose that you put a "is_alive" flag to false, to say that the NPC is dead. That would mean going through the NPC list in the room, checking if it's dead, display a different sprite in that case and handle the inventory.

But if you just move it to a different room and replace it with an object, it's a lot easier. You organize the NPCs by room, meaning that you access the room index, and inside that there is a list of NPCs and objects. You just go through the list and you don't need to handle any exception. You interact with NPCs that are there, you don't see the ones that have been moved, and you can get stuff from any container, including a dead body.