I struggled quite a bit with mozzarella before getting it right. I followed many recipes/times/milks with almost (similar to yours) results until I followed Peter Dixon's recipe (
http://www.dairyfoodsconsulting.com/recipes_fresh_mozzarella.shtml). I even had success with your typical homoginized store bought milk.
The distinguishing part of the above recipe from other recipes was the mention of the ph at draining, which is a very crucial milestone for cheese making. Assuming the milk/rennet/culture are not the problem, you should have 100% success rate if you drain the whey at ph of 6,
and make sure the curd after draining drops to a min of 5.2. If you find that when you're stirring the curd (in the whey), the curd is losing too much whey, however the ph didn't go down to 6 yet, I would recommend leaving the curd sit in the whey till it goes to 6 (to prevent the curd losing too much moisture), and then drain it.
Insuring that the ph goes down to 6 allows enough CaCl2 to leave the casein micelles (in exchange of H+) therefore weakening their bond. Too much CaCl2 between caseins=strong bond=rubbery (I'm sure linuxboy will correct me if I'm wrong
The CaCl2 can only leave the casein if the whey is still around. After draining the H+ ions won't be there to replace themselves with the CaCl2. As a rule of thumb that applies to all cheeses:
High ph at draining = rubbery/strong bonds
mid ph at draining = not so rubbery (for lack of a better term)
low ph at draining = crumbly
Of course there are so many other factors after draining that will determine the final texture and behaviour of the cheese. Hope this helps as it helped me why cheeses behave the way they do.