I’m assuming you imported a project VCF to a Hail MatrixTable before running hl.sample_qc. The mean DP produced by GATK and Hail in this case cannot be the same, because project VCF is a lossy format which discards information about loci between sites where an individual in your dataset has a polymorphism.
Hail’s dp_stats.mean is defined as, for each sample, the sum of DP values for entries observed in your VCF, divided by the number of non-missing values of DP. I would expect this to be slightly lower than the true read coverage, especially if there are low-complexity (telomeric, centromeric) regions in your VCF which bias the inclusion of a locus toward low-depth, badly-covered positions where lots of indel variants appear.