Subdivision surface - dealing with edge support loops (pinching)
You have to be careful about adding edge loops on curved surfaces. As you've already discovered, Subdivision Surface modifiers average out the vertices, so those additional edge loops pull the local faces towards itself. Thus, you should try to only add in support edges around the edges that need support.



Here's the topology I used to get that result:



When you're adding support edges/loops, here's are a few things to keep in mind:


Try to isolate the supporting edges. Have the topology of the model surround the protruding mesh and its supporting edges. In this case, notice how none of the supporting edges go beyond the original mesh from the subdivided cube. Using the Knife tool instead of Edge Loops can help here.
Avoid triangles, n-gons, and impossible faces (Ex: imagine a flat square, then you pull one of the corners upwards along the face's normal. IRL, this would end up as two triangles with an edge across the square's diagonal, but that edge is not added in 3D modelling). These often cause shading issues.
Avoid excessively or unnecessarily close vertices. This isn't always a problem. but if possible, merge them together, making sure you aren't messing up your support loops. This can be done by selecting a vertex and double pressing G to slide the vertex along its connected edges into an adjacent vertex. If you have auto-merge vertices enabled (shown below), the two will be merged together. Alternatively, you can enter Edit Mode and select Mesh > Clean Up > Merge by Distance in the top left corner of the 3D Editor.