### Tested versions

Reproducible in 4.2-stable 

### System information

Godot v4.2.stable (46dc27791) - Windows 10.0.22621 - Vulkan (Forward+) - dedicated NVIDIA GeForce GTX 1660 Ti (NVIDIA; 31.0.15.1640) - AMD Ryzen 7 4800H with Radeon Graphics (16 Threads)

### Issue description

If you have a tile_set with an occlusion layer, and you remove a tile with an occlusion shape at runtime, the occlusion shape will remain.

![image](https://github.com/godotengine/godot/assets/6132794/c9eed82b-94c4-4654-b33a-1a9c5be4d45c)

![image](https://github.com/godotengine/godot/assets/6132794/c43cc34b-d307-416e-8e3f-bf49d1421ae7)



### Steps to reproduce

- Setup a scene with CanvasModulate and a 2D Light
- Create a tilemap & tileset
- Add an occlusion layer
- Give one or more tiles an occlusion shape
- Make a script run sometime during process to randomly remove and add the tiles with occlusion shapes, and tiles without.
You should now see errant shadows.

Or, in the MRP, just play the scene and you should see the problem once tiles alternate.

### Minimal reproduction project (MRP)

[OccluderProblem.zip](https://github.com/godotengine/godot/files/13552364/OccluderProblem.zip)

mutable Rect2 rect_cache;
	mutable bool rect_cache_dirty = true;
	mutable Rect2i used_rect_cache;
	mutable bool used_rect_cache_dirty = true;
	
	bool _runtime_update_tile_data_was_cleaned_up = false;
	void _build_runtime_update_tile_data();
	void _build_runtime_update_tile_data_for_cell(CellData &r_cell_data, bool p_auto_add_to_dirty_list = false);
	void _clear_runtime_update_tile_data();
	
#ifdef DEBUG_ENABLED
	HashMap<Vector2i, Ref<DebugQuadrant>> debug_quadrant_map;
	Vector2i _coords_to_debug_quadrant_coords(const Vector2i &p_coords) const;
	bool _debug_was_cleaned_up = false;
	void _debug_update();
	void _debug_quadrants_update_cell(CellData &r_cell_data, SelfList<DebugQuadrant>::List &r_dirty_debug_quadrant_list);
#endif 
	HashMap<Vector2i, Ref<RenderingQuadrant>> rendering_quadrant_map;
	bool _rendering_was_cleaned_up = false;
	void _rendering_update();
	void _rendering_quadrants_update_cell(CellData &r_cell_data, SelfList<RenderingQuadrant>::List &r_dirty_rendering_quadrant_list);
	void _rendering_occluders_clear_cell(CellData &r_cell_data);
	void _rendering_occluders_update_cell(CellData &r_cell_data);
#ifdef DEBUG_ENABLED
	void _rendering_draw_cell_debug(const RID &p_canvas_item, const Vector2i &p_quadrant_pos, const CellData &r_cell_data);
#endif 
	HashMap<RID, Vector2i> bodies_coords; 
	bool _physics_was_cleaned_up = false;
	void _physics_update();