yeah for the masking to work, you need the mask to be another object since you need it to be on the same layer as the shadow, and also on top of them.
Now if you double the amount of object, you indeed augment the amount of calculation.
And, if you use the ZSorter plugin, I believe it does things automagically every tick.
But if you handle sorting by yourself, you can trigger the sorting actions whenever you want.
So you can just limit the recalculation each time you move an object in the Y axis more than a given number.
One way to do this, is to use the function plugin and to create a "sort" function that will reorder the sprites
Then when you drag an object, or move your character, you monitor the Y position by storing it each time you sort the sprites (so you do the storing in the "sort" function.
Then when the difference between this value and the actual Y position of the moving sprite is greater than a given value (probably proportionnal to he size of your grid), you call the "sort" function.
Hope it wasn't too complex :D
Anyway, I think the best thing you can do to take your final decision is to run some stress test on the devices you target.
Maybe you can just decide to use one technique on desktop and another on portable devices. There's probably a way to make a simple switch so you can release easily two version.