Add the chopped bacon to a cold Dutch oven over medium heat and cook for 6 to 8 minutes, stirring occasionally, until crispy and the fat has fully rendered. Transfer the bacon to a paper towel-lined plate using a slotted spoon, leaving about 2 tablespoons of drippings in the pot.
Melt the butter into the bacon drippings over medium heat, then add the diced onion and cook for about 5 minutes until soft and translucent. Add the minced garlic and cook for 1 minute until fragrant.
Sprinkle the flour over the onion and garlic mixture and stir continuously for 1 to 2 minutes until the vegetables are coated and the raw flour smell cooks off. The mixture will look clumpy — that is correct.
Slowly pour in the chicken broth while stirring constantly to prevent lumps, then add the cubed potatoes and all the seasonings (salt, pepper, garlic powder, and paprika). Stir to combine, then increase the heat to medium-high and bring to a boil.
Reduce the heat to medium-low, cover the pot with the lid slightly ajar, and simmer for 15 to 20 minutes until the potatoes are completely fork-tender.
Remove the pot from heat and use an immersion blender to blend about one-third to one-half of the soup, leaving the rest chunky for texture. Alternatively, mash some potatoes with a potato masher or blend 2 cups separately and return to the pot.
Return the pot to low heat and stir in the whole milk, heavy cream, sour cream, and shredded cheddar cheese (added in small handfuls), stirring after each addition until smooth and fully melted. Do not let the soup boil after adding the dairy.
Taste the soup and adjust salt and pepper as needed; add a splash of broth to thin or simmer uncovered to thicken. Serve hot, topped with crumbled bacon, extra shredded cheddar, sliced green onions, and a dollop of sour cream.