Array modifier with some kind of scaling transform for each iteration
You could put the array under the control of another object (here, an empty,) by checking 'Object Offset' Then any object-level transform on the empty will be applied to each instance in the array.

In this example, X runs across the steps, and Z is up. The empty has been scaled in X.



This gives a step-wise taper. The progression is geometric, not arithmetic, though.

If you wanted a linear progression, you could make each step out of two halves: assign a 'Mirror' modifier after the array,  checking 'Clip' and 'Merge', In this case, instead of scaling the empty, translate it  a little in X. This would have the effect of translating the two halves toward one another by a constant amount, each step.

If you want the taper to be continuous, don't do as above. Instead, leave the array as it was and assign another modifier: 'Simple Deform' > Taper. Select the appropriate axis for the taper. 

By default, the taper acts on both axes orthogonal to the taper direction. Lock off any axis you want to remain unaffected.. in this example, Z.



(The empty in the second illustration is redundant; I've used the step's own axes.)