> I do this all the time, and no one complains, but I do not feel that it is right...

I think a part of the problem is that the word "pullback" has two distinct meanings, which nevertheless are related.

I) Pullback whose opposite is *pushout*, rather than pushforward. This goes under the heading 
direct/inverse limits in (abstract) categories. 

II) "Pullback" whose opposite is "pushforward". As mentioned by David Roberts and David Carchedi, category theory knows these under the guise of Grothendieck [fibrations and opfibrations][2], but, as I understand, does not specify how to construct them. This seems to be another part of the problem. 

My feeling is that there exist at least two rather general constructions.

1) Initial/final structures (as in Bourbaki). For instance, quotient topology and subset topology. When initial/final structures exist, they are constructed explicitly (see for instance 10.43 in [The Joy of Cats][1]), though not necessarily effectively. There is a whole philosophy/machinery around this: concrete categories.

2) The following three examples (one covariant and two contravariant) look related, and
I don't know what category theory thinks about this relation.

a) The inverse image of a sheaf is a kind of pullback (in the sense of (I)), and 
the direct image of a sheaf is given by composition (no pushouts involved, by the way).

b,c) Induced maps and transfers in homology and cohomology. The standard algebraic view is that "pullback" (i.e. the induced map) $f^*$ is just the homology functor $h(f)$ applied to the map (i.e. something to be explained by axioms); and "pushforward" is something fancy involving integration or Poincare duality (i.e. something better not to be explained at all). Similarly (but vice versa) for homology. 

There is also a secret geometric view, which common textbooks never reveal. Here "pullback" in both homology and cohomology is given by the category theoretic pullback ((I) above) whereas "pushforward" in both homology and cohomology is given by composition. "Pullback" in homology and pushforward in cohomology are defined only for a restricted class of maps (namely those maps that themselves represent cohomology classes). Still, they are just as natural as induced maps, but with respect to a different set of data; so when it comes to composing a "pullback" with a "pushforward" (which amounts to a cup or cap-product), transversality has to be applied, which breaks geometric naturality. (With a hint at Steenrod squares. Of course, nothing ever breaks naturality on the algebraic level.) 
Again, there is a whole philosophy/machinery about this, developed in [Buoncristiano-Rourke-Sanderson, A geometric approach to homology theory][3] (start from Chapter 2). 
An elementary warm-up with pictures is in Chapter 1 of Fenn's *Techniques of Geometric Topology*, and another elementary warm-up is in [Kreck's recent book][4]; but to see the above picture clearly it is best to read B-R-S.
A short summary is in section 2 [here][5].

  [1]: http://katmat.math.uni-bremen.de/acc/
  [2]: https://ncatlab.org/nlab/show/Grothendieck%20fibration
  [3]: https://books.google.com/books?id=fBA8AAAAIAAJ&lpg=PP1&ots=Rr9nixA1cL&dq=Buoncristiano-Rourke-Sanderson%25252520A%25252520geometric%25252520approach%25252520to%25252520homology%25252520theory&pg=PP1#v=onepage&q&f=false
  [4]: http://www.hausdorff-research-institute.uni-bonn.de/files/kreck-DA.pdf
  [5]: https://web.archive.org/web/20210514040419/https://arxiv.org/abs/math/0612082