Peel and dice potatoes into uniform 1/2-inch cubes, then place in a bowl of cold water to prevent browning. Finely dice the onion, mince the garlic, shred the cheddar from a block, and let the cream cheese soften at room temperature cut into small cubes.
Melt the butter in a large Dutch oven over medium heat, then add the diced onion and cook for 5 to 6 minutes until soft and translucent. Add the minced garlic and stir for 60 seconds until fragrant.
Sprinkle the flour over the onion and garlic and stir constantly for 1 to 2 minutes until the mixture is coated and the raw flour smell cooks off. The roux will look paste-like — that's correct.
Slowly pour in the chicken broth while stirring constantly to prevent lumps, then drain the potatoes and add them to the pot. Stir in the garlic powder, onion powder, smoked paprika, salt, black pepper, and cayenne if using, then bring to a gentle boil over medium-high heat.
Reduce the heat to medium-low, cover loosely, and simmer for 15 to 20 minutes, stirring occasionally, until the potatoes are completely tender and easily mashed against the side of the pot.
Remove from heat and use an immersion blender to blend about half the soup until smooth, leaving the remaining potato chunks intact for texture. If using a standard blender, carefully ladle half the soup in, blend, and return it to the pot.
Return the pot to medium-low heat and stir in the whole milk and heavy cream. Add the softened cream cheese cubes and stir gently for 2 to 3 minutes until fully melted and smooth — do not let the soup boil.
Reduce the heat to the lowest setting and add the shredded cheddar in two or three batches, stirring each addition completely before adding the next using a gentle figure-eight motion. Taste and adjust seasoning with additional salt and pepper as needed.
Ladle the soup into warm bowls and top with sour cream, crumbled bacon, extra shredded cheddar, and sliced green onions. Serve immediately alongside biscuits, dinner rolls, or crusty bread.