Spanish does not have the kind of vowel reduction that many Germanic languages (like English) have, but it does have vowel reduction. The difference is that English has the kind of vowel reduction that neutralizes differences between vowel phonemes, and Spanish has a kind of vowel reduction that still maintains the differences of the five vowel phonemes found in most accents of Spanish.
In other words, the stressed allophones of /a o u e i/ are distinct from each other, and so are their unstressed allophones.
To go into a bit more detail, the fact is the pronunciation of vowels in any language is influenced to some degree by the other sounds adjacent to it (as well as other paralinguistic factors affecting the vocal organs – smiling, for instance, tends to spread the lips). Because of this, when discussing a vowel phoneme, we have to consider the different allophones; we can also think of a vowel as occupying a “vowel space” containing its different allophones. In a language like English, with more vowels and a higher degree of neutralization of vowels in certain environments, the vowel spaces will be smaller and have more overlap. In Spanish, the vowel spaces are bigger, and do not overlap. In other words, in Spanish, vowels allow for more allophonic variation, and are less likely to be misheard as other vowels by native speakers.
First off, some facts about stress in Spanish. In Spanish, stress is mainly indicated by three factors: tone, volume and vowel length. Syllables carrying stress have a higher volume and a higher tone, and vowels in stressed syllables are longer. However, Spanish being a syllable-timed language, the difference in length between a stressed and an unstressed vowel is not quite so pronounced as in English.
Let’s talk about the stressed and unstressed allophones (the Spanish vowel space) in more detail.
/a/ occupies a vowel space including a ~ ä ~ ɑ ~ ɐ. a is the fronter allophone, found in the vicinity of other front sounds (dentals, interdentals, i, j), especially when flanked by two front sounds. ɑ is the backer allophone, found in the vicinity of back sounds (velars, uvulars, u). ä is the “default” allophone, found in other stressed instances. Finally, ɐ, a closer sound, is the unstressed allophone. Examples:
/e/ occupies a vowel space including e ~ e̞ ~ ɛ. They go from closer to opener, the unstressed allophone always being the closer e. Examples:
/o/’s vowel space includes o ~ o̞ ~ ɔ ~ ɤ. Like /e/, they go from closer to opener, with the unstressed allophones being the closer o and ɤ. It’s usually unrounded ɤ when unstressed, but can be rounded o when adjacent to rounded vowels or labial sounds, like in the previous example pɾoˈme̞sɐ. Examples:
/i/ occupies a space around the cardinals i ~ ɪ, with the usual stressed allophone corresponding to neither, but being found somewhere in the middle. The unstressed allophone is distinguishable from the stressed one by relative degree of fronting and, if utterance final, degree of closeness, but it is still very close and front, so the main difference is just length.
/u/ occupies a space around the cardinals u ~ ʊ, but with the stressed allophone being very similar or identical to cardinal u – very back, very close, very rounded. The main difference in the unstressed allophone is length, though it can also exhibit a bit less rounding (but not total loss of rounding), and, if utterance final, less closing. In this regard, it is similar to /i/.
When it comes to the relative openness of /e/ and /o/, there is a bit of dialectal variation. Impressionistically, I think Rioplatense in Argentina and the northern dialects of Spain have relatively less open allophones of /o/ and /e/ than other dialects.
There are also other types of vowel reduction in some accents of Spanish. Some feature devoicing of vowels when flanked by voiceless consonants. Some feature it when preceded by a voiceless consonant and followed by a pause. The times I have encountered this feature “in the wild”, it was not categorical – sometimes it happened, sometimes it didn’t – but the degree of this varies between accents.
Everything outlined above has interesting consequences for the learning of Spanish as a foreign language.
When it comes to English speakers learning Spanish, for example, the fact that unstressed /e/ is pronounced e leads to many learners hearing it as ɪ. Subsequently, because they know Spanish has no i / ɪ contrast, they pronounce it as Spanish i. This is a potential comprehension problem, because Spanish does distinguish unstressed /i/ from unstressed /e/.
A similar thing happens with unstressed /o/, o or ɤ. English speakers sometimes hear it as ʊ, and, because they know Spanish does not contrast u and ʊ, pronounce it as Spanish u. But Spanish does distinguish unstressed /o/ from unstressed /u/.
A specific problem involving unstressed /o/ is that English speakers often pronounce the endings -aron, -eron as something Spanish speakers hear as -aran, -eran. And that’s the only thing distiguishing the preterite from the imperfect subjunctive in the third person plural.
Here’s another more important problem: Spanish contrasts unstressed /e/ and unstressed /a/. However, because of English vowel reduction, and also because of the pronunciation of unstressed /a/ as ɐ (English schwa does sometimes approach an ɐ realization, especially when utterance-final), English speakers have trouble reliably distinguishing unstressed /e/ from unstressed /a/ both in perception and in production. This is a tricky one, because differences in unstressed /e/ and /a/ distinguish the present indicative from the present subjunctive (and the imperative, which shares many of its verb forms).
All of the above suggests that any English speaking learner of Spanish needs to pay special attention to their pronunciation of unstressed vowels in order to be able to get close to a nativelike pronunciation.
A final tidbit regarding stressed /a/: because its allophone ä is a central vowel, different dialects of English have historically heard it and produced it differently. Because contemporary RP has a very back /ɑ/, approaching the cardinal, and an open /æ/ approaching cardinal a, it maps Spanish stressed /a/ to the latter. On the other hand, most dialects of American English actually do pronounce /æ/ as æ (when they don’t diphthongize it), and their /ɑ/ is less backed, so they map Spanish stressed /a/ to the latter.
As a result, our earlier example Málaga, ˈmälɐɣ̞ɐ in Spanish, is mapped to /ˈmæləgə/ and pronounced ˈmaləgə in British English, but mapped to /ˈmɑləgə/ and pronounced ˈmɑ̈ləgə in American English.