You’d still want to use the directional chart idea.
[3] The approach I ended up using is very similar to a Dijkstra map, a pathfinding tool from roguelike games, which I discovered as I was writing this. As far as I could tell, my approach extends a Dijkstra map to handle minimal updates as the target moves and obstacles update
That's a huge overkill. A single dijkstra per game tick (or even only when map changes or player moves) is enough.