I have a 2006 Duramax with the LBZ engine and have had it since new. I typically get 15-16 with all in town driving and 19-20 on the highway not towing. Towing a 14,000 fifth wheel I typically get 12 +/- .5 mpg.
Are you basing your mileage on the computer read out? If so that is your problem. I have noticed that when you start many times for just trips the computer information can not be trusted. It gets a little bit lower with each start it seems. I have no idea why since I didn't design it, but I can tell you that if you fill up, drive only very short trips your mileage will show very low. If you then put it on the highway without resetting the computer or filling up you will see the mileage start to increase with each mile. It will never get up to highway mileage without a reset due to it being an average since the last reset.