Heat a large pot or Dutch oven over medium heat. Add bacon strips and cook until crispy. Remove and place on a paper towel. Once cool, crumble into small pieces. Leave about 1 tablespoon of bacon fat in the pot.
Add butter to the pot with bacon drippings. Once melted, add diced onion. Cook for 4-5 minutes until soft and translucent. Add minced garlic and stir for another minute, being careful not to burn it. Sprinkle flour over the onion and garlic. Stir constantly for about 2 minutes to cook out the raw flour taste and start thickening the soup.
Slowly pour in the chicken broth while stirring to avoid lumps. Add the diced potatoes. Stir and season with salt, pepper, smoked paprika, and garlic powder. Bring to a gentle boil, then lower the heat to simmer. Let the soup simmer uncovered for 15-20 minutes until the potatoes are tender. Stir occasionally.
Use a potato masher to mash about half the potatoes in the pot, thickening the soup while keeping some chunks. For a smoother texture, briefly use an immersion blender.
Reduce the heat to low. Stir in heavy cream and sour cream. Slowly add shredded cheddar cheese in small handfuls, stirring between additions. Keep the heat low to avoid grainy cheese.
Taste the soup. Add more salt, pepper, or paprika as needed. Let it sit on low heat for 3-5 minutes to combine the flavors. Ladle into bowls and top with extra shredded cheddar, crumbled bacon, a dollop of sour cream, and sliced green onions. Serve immediately.