For the gun to be shooting 4" groups at 21 feet, either the bore is very bad/smooth/badly leaded, the crown is badly damaged, or something having to do with the point of impact is shifting in the gun by about 2mm between shots.
With a dummy round chambered, try wiggling the barrel back and forth or up and down. Don't apply enough force to take the gun out of battery by pulling/pushing the slide backwards. What you're looking for is side-to-side or up-and-down play in the barrel with the gun in battery and a round chambered. You can also check to see if the rear sight is loose at this point.
2mm is a lot of play, you should be able to detect it very easily if anything is loose. Remember that the slide needs to be fully forward with a round chambered for the barrel play test. Checking for barrel play with the slide locked back is pointless.
If you can't detect any play, examine the crown for nicks and burrs or other damage.
If there's no crown damage or barrel play, the next step is to check the bore. I've seen a 92FS bore lead so badly that it became very inaccurate. The shooter was using lead bullet ammo with bullets that were very thinly plated with copper, giving the appearance of jacketed rounds. When you check the bore, you want to see a nice clean rifling with no damage. It's also worth checking the bore diameter by turning a 9mm cartridge around to see if it will drop into the muzzle. It should not go in very far at all. If the bore doesn't show any significant leading and doesn't look damaged, and if a 9mm bullet won't fit down the muzzle, then you've pretty much eliminated the bore as being the cause.