In a large Dutch oven over medium heat, cook the chopped bacon until crisp, about 6–8 minutes. Remove with a slotted spoon and set aside, leaving the rendered fat in the pot.
Add the butter to the bacon fat and melt. Add the diced onion and cook for 4–5 minutes until softened. Add the garlic and cook 30 seconds more.
Sprinkle the flour over the onion mixture and stir constantly for 1–2 minutes, until pale golden and no raw flour smell remains.
Slowly whisk in the chicken broth, then add the diced potatoes. Bring to a simmer, reduce heat, and cook 15–18 minutes until fork-tender.
Use a potato masher to lightly mash about a third of the potatoes directly in the pot, leaving the rest in chunks.
Reduce heat to low. Stir in the softened cream cheese in small pieces until fully melted, then pour in the heavy cream and stir to combine.
Remove the pot from heat. Stir in the shredded cheddar a handful at a time, letting each addition melt before adding more.
Stir in the salt and pepper, tasting as you go. Ladle into bowls and top with reserved bacon, extra cheddar, and green onion.