Why? Surely if the phone is lying flat the g readings from the sensor should be (x, y, z) 0,0,1 so if they're 0.02,0.043,0.97 then the software knows it has to apply a -0.02,-0.043,+0.03 correction to all the data from then on? Isn't this what it does on a per-app basis when you tap the screen in the Level app to set it to zero?
There are two implied questions here. I'll try to address the second one first (and I think you already understand the answer). When you are running the iOS 7 Compass app, and using the inclinometer function, a tap on the screen does indeed zero out the reading. But this is not a calibration. You are just forcing the reading to zero, in whatever orientation the device is in at the time. It puts the app into a temporary "difference mode" which can be useful for comparing measurements at two different locations. Zero it on one surface, put it on the other surface, and the device will display the difference in their slopes. Tap the screen again, "difference mode" is cancelled, and the phone is again reading absolute orientation (which may be miscalibrated).
A true calibration would store data that corrects any offset errors (biases) in the hardware, so that the readouts are correct, relative to the true vertical defined by the force of gravity. Some third party apps (like Clinometer from PlainCode) provide a user-run calibration method that prompts the user to take measurements with the device placed in three orientations. This creates independent calibrations for each axis of the accelerometer chip.
It might be possible to calibrate all three axes by taking measurements with the phone lying on its back on a level surface, as in the method suggested by some of the Apple support reps. But for this to work, the sensing axes within the accelerometer chip would have to be perfectly orthogonal, and the offset errors of the axes would have to be correlated. Then, knowing the magnitude and direction of gravity, and the uncorrected readouts of the three accelerometer axes, you can do vector math to compute the angular error on each axis, and derive calibration corrections. If this is really the way it is supposed to work in iPhone 5s, I have no idea why it does not work. Maybe there really is a software bug.
I feel that the calibration method in Clinometer is likely to give better results. Ideally, Apple would provide a software update that adds a similar procedure within the Compass app, or perhaps within the Settings app. This procedure would store a system-wide calibration, correcting the accelerometer data for any app that used iOS services. And it would be optional. Those users who wanted max accuracy would run the calibration. Other users could ignore it.