Dice onions. Remove seeds and chop poblanos into about ½" pieces.
Peel and cut potatoes into about ¾" pieces. Try to keep all of the potatoes about the same size.
Preheat a heavy-bottom dutch oven over medium heat. While heating, cut bacon into bite-size pieces about ½" thick. Cook bacon until crispy, about 10 minutes. Remove bacon from pan and set aside.
Carefully remove bacon drippings leaving 2-3 tablespoons in the pan. Add poblanos and cook for about 5 minutes. Remove poblanos from the pan and set aside.
Add onions and butter to the pot and cook, stirring occasionally, until onions are translucent, about 10 minutes. While onions are cooking chop garlic.
Add garlic and cook for 1 -2 minutes until fragrant.
Add flour and cook for 1 -2 minutes, stirring continuously.
Turn the heat up to medium-high and add chicken stock. Using a whisk, whisk the chicken stock with the flour and onion mixture until the flour is fully incorporated. Try to get all brown bits off the pan for added flavor (brown bits=flavor).
Add milk, potatoes, salt, and pepper. Once the mixture starts to bubble, reduce heat to medium. Stirring occasionally, cook until potatoes are fork-tender, about 10 - 15 minutes.
Reduce heat to low. Using an immersion blender, puree ½ of the soup. If you don't have an immersion blender, you can carefully blend ½ of the soup in a blender until smooth. Once the soup is pureed, add it back to the soup pot.
Soup should be creamy with chunks of potatoes.
Add cream, sour cream, smoked paprika, bacon, and poblanos (reserve ½ cup of poblanos for the gremolata, and some of the bacon to garnish the soup, if desired). Simmer on low for 10 - 20 minutes or until the desired consistency is reached. Add salt and pepper to taste.
Serve it up and take it over the top! Garnish with shredded cheddar cheese, sour cream, green onions, bacon, and gremolata.