I would go with simplest approach.
1. If you want big world, you will definitely need spatial partitioning. Grid would be the easiest. QuadTree sounds fancy, but isn't always better.
2. Tilemaps use spatial partitioning by definition, so you don't have to insert separate tiles to another grid/tree (waste of memory and CPU).
3. Layers 6 - 8 can be IMO grouped as one thing - GUI. Not sure what those text objects are. Console?
4. Layer 1 one is probably tilemap, so see point 2.
5. Layers 2-5 should go into your spatial partitioning structure. Give each object some layerID so you can sort them later. They can be sprites.
Then, every frame:
1. Get visible region of tiles, write them to vertex array and draw (you should reuse one array).
2. Get visible objects from your grid/tree, sort by layer and draw.
3. Draw GUI hovever you want.
Note: try not to change texture between draw calls, use sprite sheets.
Note: group your particles (layer 3) by source so they don't take too much space on grid/tree.
EDIT: I recently updated my
spritebatch, which my help. Sprites are quite heavy so usually it's better to generate vertices directly.