Rotating Array Modifier applied to a rotated object issue
Select the smaller cylinder and apply the rotation and scale.



This can also be done by pressing CtrlA followed by O.

The result should be like this.



Then select the empty and rotate it around the Z axis.



N.B. You could also rotate the small cylinder itself around the Z axis, but I prefer doing all transforms on the empty when using one to guide an array.
And the reason why this happens, is that for every duplicate the Array modifier makes, it takes into account the transforms of both the duplicated object and of the empty. I have not read the source code, nor have I found specific information on how it calculates the transforms, but from what it looks like to me, it divides the scale of the empty by the scale of the object.
An example: The object has scale set to 0.333 and the empty has scale set to 2. The overall scale for each repetion would be 2/0.333 = 6, so each duplicate would be 6 times bigger than the previous one.
With rotation and position, it looks like it's just subtracting the position and rotation respectively of the empty from the position and the rotation respectively of the object.