In a medium saucepan over medium heat, melt the butter. If using onion or shallots, add them now and sauté until softened and translucent, about 3-5 minutes. Be careful not to brown them.
Sprinkle the flour over the melted butter (and onions, if using). Whisk continuously for 1-2 minutes to cook out the raw flour taste and form a smooth paste, known as a roux. The roux should be a pale golden color.
Gradually whisk in the beef broth, a little at a time, ensuring no lumps form. Once all the broth is incorporated and the mixture is smooth, whisk in the water, soy sauce (or Worcestershire sauce), and black pepper.
Bring the mixture to a gentle simmer, whisking occasionally. Reduce the heat to low and let it simmer for 5-10 minutes, or until the gravy has thickened to your desired consistency. It will continue to thicken slightly as it cools.
Taste and adjust seasoning with salt and pepper if needed. Remember that the broth and soy sauce already contain salt, so add carefully.
Serve hot and enjoy!