For massive maps with many layers I store batches of tiles in chunks of data. Each chunk of data populates a sprite with tiles and I recycle sprites from one side of the viewport to the other to avoid new object creation. Moving individual tiles around this way is really expensive and should probably be avoided, especially on mobile. A huge benefit from this can be found in collision detection since you can detect which chunk(s) is intersecting with your player and then only check collisions on the tiles in the chunk you're colliding with instead of all the tiles in the viewport (huge speedup). Another option is to use quad trees. There's an old extension that doesnt take much to update to work with the current version of starling. https://wiki.starling-framework.org/extensions/quadtreesprite (or you can just write your own QuadTree, it's not that difficult). https://en.wikipedia.org/wiki/Quadtree
Using MeshBatches would also be really efficient assuming the logistics drawbacks in terms of certain limitations involving game mechanics doesn't bother you..(or you use a workaround).
Here is some footage of one of my games(2DMMOARPG) built with starling for mobile that use the method I detailed first. https://www.youtube.com/watch?v=rJotB26ym_A
Achieving smooth 60 fps on low end phone here.