First we have to decide which Hebrew we're talking about. Biblical Hebrew can certainly be transliterated programmatically, since Medieval scribes augmented the writing system to include disambiguating diacritics and added them to the entire corpus so that it could be read aloud.
However, the process is not so easy for Modern Hebrew, for which these diacritics are rarely added — usually only on foreign transliterations or children's learning materials. If you have a text with them, you're in luck. If not, well... Let's take a look.
Let's say that there are three categories of grapheme (letter or letter sequence):
Those that have a one-to-one correspondence to a phoneme.
Those that can represent different phonemes, but whose value can be determined purely by the other graphemes around it.
Those that can represent different phonemes, and that require knowledge of the language (vocabulary or grammar) to differentiate.
In addition, we can use a similar categorization for phenomena such as stress and tone: whether they can be derived from the graphemes and context, or whether you need a database.
Hebrew's writing system is mostly divided between the first and last categories.
The majority are the easy kind: ג ד ח ט ל מ נ ס ע צ ק ר ת
These have only one pronunciation and can be transliterated automatically. Note that you will lose etymological information; specifically, some of the above can be doubled, which tells you something about the root, but no longer affects pronunciation.
The soft/hard letters: ב כ פ
For the most part, these have one pronunciation in forte position (start of a syllable or after a consonant) and another in lene position (end of a syllable or after a vowel).
However, they also vary based on lexical and syntactic content. Specifically, certain prepositions double the following sound, and certain conjugations double one of the sounds in the verbal root. In both cases, these sounds are pronounced in the hard variation instead of the soft one. You can't get around this without parsing.
The vowel/consonant alternators: ו י
These letters can represent a vowel or a consonant. They are almost programmatic. Usually, they represent the vowel when between consonants or word-final, and the consonant at the start of a syllable or between vowels. In foreign names these are sometimes doubled to indicate the consonant. However, there are exceptions that require parsing.
However, וו is always the foreign sound /w/, to my knowledge.
The vowel presence indicators: א ה
א can be silent or pronounced as a glottal stop depending on dialect, but either way, it can also indicate the presence of a vowel. This is usually if it occurs at the start or end of a word beside a consonant. However, there are exceptions that require parsing.
Similarly, ה is pronounced like English "h" but it can also be silent at the end of a word, in which case it indicates that there is a vowel at the end of the word. It would be programmatic based on this context except that it can occur syllable-finally in the middle of a word, usually due to pronunciation, and without parsing you can't tell whether this is silent or not.
Two sounds in one letter: ש
Without diacritics, there is no way to tell whether this is s or sh besides looking up the word.
Geresh
If a single geresh occurs in the middle of a word, it represents a foreign phoneme.
If a single geresh occurs at the end of a word on a letter other than ג ד ז ח ס ע צ ר ת, it represents an initialism.
If it's at the end of a word on one of those letters, you need a lexicon.
Two together (gershayim) always represent an acronym (e.g. תנ״ך tanakh), but you can't tell whether this is read as a word (like "NASA") or as a series of letter names (like "NSA"). You can read about clues on the Wikipedia article on Hebrew abbreviations (but there are, of course, exceptions).
Five letters have a different word-final form in Hebrew: כ/ ך ; מ/ ם ; נ/ ן ; פ/ ף ; צ/ ץ. In theory, these are used in a way that allows you to distinguish some of the above cases, but in practice it's not done consistently.
Stress
Stress is mostly regular in Hebrew. It falls on the last syllable, except for certain suffixes. There are some words that take stress on the first syllable. These are mostly bisyllabic words with two of the same vowel, such as חרב khérev "sword". But this brings us to our next point.
Vowels
In Hebrew, unlike in English, vowels need not be marked. They can be inferred, but there's lots of unavoidable ambiguity. If I write חרב you have no idea whether it's kherev, kharav, kherv, kharv, khrev, or khrav unless you have a dictionary.
Now, don't get me wrong: Modern Hebrew is more explicit than Biblical Hebrew was, and often uses the four vowel/consonant letters א ה ו י more liberally to indicate where a vowel is. For example, imagine the name "David" (dah-veed) had never existed and Hebrew speakers now encountered it for the first time. They would not write it דוד as it was in Biblical Hebrew, because it looks like "Dood". They would prefer something like דויד.
But here's the kicker. Even with those helps, you can't tell exactly which vowel is meant. /u/ and /o/ are ambiguous. /i/ and /e/ are ambiguous. Schwas are ofen ambiguous; the only thing you know for certain is that there aren't two in a row. And because of these, many of the rules I've stated above can't even be followed programmatically because you can't identify the triggers.
Of course, anything is possible as long as you're willing to parse. But if I understand your question right, you're wondering if there's a way for your system to transliterate a text based only on orthographic and pholonogical knowledge, without recourse to lexical and syntactic properties. This is not possible in Modern Hebrew.