How to create label with variable size in ArcMap?

You would do this by setting up a formatting expression for the labels you want to create.

This Knowledgebase article has a pretty thorough breakdown: HowTo: Include table fields in a VBScript label expression and use those values as dynamic font properties

This is what a sample expression from that page would look like. It is VBScript, but can be easily adapted to use Python. As you can see, the [Text Size] field is being referenced to set the size of the label.

Label expression

Here is the help document for more info on label expressions: ArcGIS 10.1: Building Label Expressions


Without using Annotation you can use "Setting scale ranges for label classes"

Some labels are most useful within a given scale range. For example, on a city map, a label class of all street names might be useful up to some minimum scale. As you zoom out beyond that scale, the labels would become too crowded—or too small, if there is a reference scale set—and you might prefer to display a label class that only showed major street names.

Setting a minimum scale for labels can improve the overall redraw performance of your map, making panning and zooming more responsive, as labels are only drawn within the scale range at which they are useful.

http://resources.arcgis.com/en/help/main/10.2/index.html#//00s800000023000000

To improve label placement use the Maplex Label Engine instead of the standard engine.

enter image description here

http://resources.arcgis.com/en/help/main/10.2/index.html#/A_quick_tour_of_the_Labeling_toolbar/00s800000014000000/