I've cleaned up the NPC system. Basically, there was sort of a weird amalgamation of code that was completely separate from the other entity-handling code, which was confusing my attempts to implement a story feature and would likely have continued if I didn't fix it! So I fixed it.
It wasn't totally simple, but it wasn't quite as bad as I might have feared. It's quite tricky to keep the NPCs smart enough to move around the world properly (since the entire world isn't always loaded.) The upshot of what I did is that the system is indeed cleaner and more flexible, so I can potentially have other types of things that move around the world.
Back to implementing the story feature I was working on yesterday morning! Hooray!