There are two sides of it:

1) The precision of the estimation of the band gap is determined by the parameter N in the script, and If you made the correction I suggested in the other post to the script, then try to use N = 1000, and see what you get. If it remains the same, then 0.06 eV is most likely the correct result.

2) I assume that when you say theory, it is the analytical expression for the band structure for Carbon nanotubes, you are taking about.

The analytic expression for the band structure (band gap) is based on a folding of the brillouin zone for the 2D energy band structure for graphene sheets, however for the analytical expression to be correct, it is assumed that atoms sitting the the carbon nanotube, is not affected by atoms across the tube, and the atoms is not affected by the curvature of the graphene sheet, that arises for when folding it into a carbon nanotube. It means that the analytical expressions is incorrect for small carbon nanotubes, and (4,4) is a very small carbon nanotubes. ( The nature of a (4,4) CNT is more like that of atomic carbon chain than analytical carbon nanotube of size (20,20) ).

This is the reason why it is needed to perform DFT calculation on a system like this one.

In short the difference between a direct band gap and indirect band gap, is that a band gap is smallest energy of that is required to excite a electron from the valence band to the conducting band. If this band gap requires an phonon interaction in order to be possible, it is called indirect, if it does not require a phonon interaction it is called direct. Therefore you often give both values, since the mechanics behind exciting atoms in the material is quite different if there is a need for phonon in order to allow the excitation.

The indirect band gap is always smaller or equal to the direct band gap, and if they are equal, it is due to the fact that a phonon is allowed to have the zero momentum.

For details on the direct and indirect band gap, I have found this

wikipedia page.